513.找树左下角的值
思路:
1.迭代法
每一层遍历开始,先存放result,再开始遍历,最后返回result。
2.递归法
定义一个pair<val,depth>,定义函数为
void find(TreeNode* root,pair<int,int>&pairs)
边界:root==NULL return;
顺序:左右中
用depth回溯
判断条件: 如果当前depth大于已记录的depth,则返回新pair,效果是只记录每一层第一个碰到的节点。
if(depth>pairs.second)pairs={root->right->val,depth};
看视频后:
边界条件有两个:
1.root==NULL 树不存在 return
2.root->left==NULL&&root->right==NULL 叶子节点
是叶子节点时需要判断当前的depth和已记录的节点的depth谁大。
可以不用pair,用两个参数即可。
112. 路径总和
重新定义一个函数,函数参数为
void pathSum(TreeNode* root,int &sum, vector<int>&result)
result用于存储所有路径总和
中止条件:
if(root==NULL) return;
if(root->left==NULL&&root->right==NULL)
result.push_back(sum);
使用sum进行回溯;
左:
if(root->left)
{
sum+=root->left->val;
pathSum(root->left,sum,result);
sum-=root->left->val;
}
最后在主函数里比较result里是否有与targetSum相等的值
看视频后:
在左右遍历的时候加上判断条件
if(hasPathSum(root->left,targetSum)) return true;
则将下层true返回上层,不需要全部路径遍历,只要找到一条就可以返回
113. 路径总和.2
回溯的时候不仅回溯targetsum,而且回溯记录的members。不要忘记传入根节点的数值。
106.从中序与后序遍历序列构造二叉树
思路:
能在纸上画出来但不知道代码怎么写
看视频后:
处理逻辑:
第一步:如果数组大小为零的话,说明是空节点了。
第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。
第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点
第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)
第五步:切割后序数组,切成后序左数组和后序右数组
第六步:递归处理左区间和右区间
1. 注意叶子节点 if(postorder.size()==1)returnroot;
2.如何定义vector 如vector<int>leftInorder(inorder.begin(),inorder.begin()+delimiterIndex);
3.中序数组大小一定是和后序数组的大小相同的!用中序数组的切割结果来切割后序数组!
4. 记得处理root节点 postorder.resize(postorder.size()-1);
105同理。