513.找树左下角的值
层序遍历
如果用迭代法(层序遍历,只用在每一层开始的地方将result记为队列中第一个出来的数即可)
递归
需要记录用一个当前深度和最大深度,只有当深度>最大深度时更新result,这样同层不会处理第一个后面的数,任意遍历顺序都可,因为左都在右之前。
int result;
int maxdepth=0;
void getans(TreeNode* root,int &depth){
if(root->left==NULL&&root->right==NULL){
if(depth>maxdepth){
result=root->val;
maxdepth=depth;
}
return;
}
if(root->left!=NULL){
depth++;
getans(root->left,depth);
depth--;//回溯的过程,
}
if(root->right!=NULL){
depth++;
getans(root->right,depth);
depth--;//回溯的过程,
}
}
112. 路径总和
题目
该问题是找到一条符合的路径。
如果要搜索其中一条符合条件的路径,那么递归一定需要返回值,因为遇到符合条件的路径了就要及时返回。
如果搜整棵树,则用void就行
(这题思路和之前记录所有路径一模一样,用回溯法)
int sum=0;
bool hasPathSum(TreeNode* root, int targetSum) {
sum+=root->val;
if(root->left==NULL&&root->right==NULL) {
if(sum==targetSum) return true;
return false;
}
if(root->left!=NULL){
if(hasPathSum(root->left,targetSum)){
return true;
}
sum-=root->left->val;//回溯
}
if(root->right!=NULL){
if(hasPathSum(root->right,targetSum)){
return true;
}
sum-=root->right->val;
}
return false;
}
而当要记录所有路径和==目标值的路径时,用void即可。
106.从中序与后序遍历序列构造二叉树
后序:左右中;
中序:左中右
所以中间的节点就是后序的最后一位,因为没有重复的,所以可以根据postorder.back(),找到中序中对应值的下标,将前后分为两段中序,再根据其大小建立两段后序。
void build(TreeNode* &root,vector<int> inorder,vector<int> postorder)
if(postorder.size()==0) return ;//终结条件:
int value=postorder.back();
root=new TreeNode(value);//传入中间值
int index=0;
vector<int> inorderleft;
for(;inorder[index]!=value;index++){
inorderleft.push_back(inorder[index]);
}
//找到了index后分别建立....
build(root->left,inorderleft,postorderleft);
build(root->right,inorderright,postorright);
注意这样传入root的引用,不用引用只是赋值拷贝,对传入的数据本身没有影响,root->left在函数外还是NULL;