文档讲解:代码随想录
视频讲解:
状态
int findBottomLeftValue(TreeNode* root) {
//层序遍历获取最后一层第一个值
queue treeque;
int res;
if(root) treeque.push(root);
while(!treeque.empty())
{
int tempsize = treeque.size();
for(int i=0;ileft==nullptr&&cur->right==nullptr)
{
res = cur->val;
}
if(cur->left) treeque.push(cur->left);
if(cur->right) treeque.push(cur->right);
}
}
return res;
}
if(root->left==nullptr && root->right == nullptr)
{
return ;
}
如果此时的层数大于记录的最大层数那么就需要更新最大层数和最左值。
if(root->left==nullptr && root->right == nullptr)
{
if(dep > maxdep)
{
maxdep = dep;
res = root->val;
}
return ;
}
//中节点 没有操作,如果是求深度需要记录当前节点的最大深度 maxdep = maxdep>dep ? maxdep:dep
//左节点
if(root->left)
{
//修改传入参数,及深度加1
//如果参数是引用传入int& dep
dep++;
func1(root->left,dep);
dep--;
//如果只是值传递,可以利用语言特性传入dep+1这样不会修改当前dep值
func1(root->left,dep+1);
}
具体代码
class Solution {
private:
int maxdep = INT_MIN;
int res;
public:
void GetLeft(TreeNode* root,int& dep)
{
//终止条件
if(root->left==nullptr&&root->right==nullptr)
{
if(dep > maxdep)
{
maxdep = dep;
res = root->val;
}
return;
}
//左节点
if(root->left)
{
dep++;
GetLeft(root->left,dep);
dep--;
}
//右节点
if(root->right)
{
dep++;
GetLeft(root->right,dep);
dep--;
}
return;
}
public:
int findBottomLeftValue(TreeNode* root) {
int dep = 0;
GetLeft(root,dep);
return res;
}
};
文档讲解:代码随想录
视频讲解:
状态
昨天那道求所有路劲的方法
class Solution {
private:
int target;
public:
bool GetSum(TreeNode* root, vector& path, int sum)
{
//中节点
path.push_back(root);
//终止条件
if(root && root->left==nullptr && root->right == nullptr)
{
for(int i = 0;ival;
}
if(sum == target)
{
cout << sum;
return true;
}
}
//左节点
if(root && root->left)
{
//GetSum(root->left,path,sum);
if(GetSum(root->left,path,sum)) return true;
path.pop_back();
}
//右节点
if(root && root->right)
{
//GetSum(root->right,path,sum);
if(GetSum(root->right,path,sum)) return true;
path.pop_back();
}
return false;
}
public:
bool hasPathSum(TreeNode* root, int targetSum) {
target = targetSum;
vector path;
return GetSum(root,path,0);
}
};
还可以稍微优化一下,可以将sum放进终止条件中,因为我们也只是利用它了求和
文档讲解:代码随想录
视频讲解: 坑很多!来看看你掉过几次坑 | LeetCode:106.从中序与后序遍历序列构造二叉树
状态
后序遍历最后一个就是根节点,前序遍历第一个就是根节点,然后根据根节点分割中序遍历,得到两个数组,
这两个数组在后序或者前序中又重复之前的步骤(相当于子树)
一定要保持切割区间的对应性,比如中序切割时是左闭右开,那么后序切割也需要是左闭右开
在后序中,由于根节点移到了最后,所以右子树从i开始
class Solution {
TreeNode* binaryTree(vector& inorder, vector& postorder)
{
if(postorder.size() == 0) return nullptr;
//获取树的根节点值
int rootval = postorder[postorder.size()-1];
//创建根节点作为返回值
TreeNode* root = new TreeNode(rootval);
//当前根节点在中序中的位置
int i;
for(i=0;i leftinorder(inorder.begin(),inorder.begin()+i); //[inorder[0],inorder[i-1]]
vector rightinorder(inorder.begin()+i+1,inorder.end()); //[inorder[i+1],inorder[inorder.size()-1]]
//分割后序数组
//去掉最后一个数
postorder.resize(postorder.size()-1);
//leftinorder.size() = i
vector leftpostorder(postorder.begin(),postorder.begin()+leftinorder.size());
vector rightpostorder(postorder.begin()+leftinorder.size(),postorder.end());
//递归
root->left = binaryTree(leftinorder,leftpostorder);
root->right = binaryTree(rightinorder,rightpostorder);
return root;
}
public:
TreeNode* buildTree(vector& inorder, vector& postorder) {
if (inorder.size() == 0 || postorder.size() == 0) return NULL;
return binaryTree(inorder, postorder);
}
};