代码随想录第十八天|513.找树左下角的值、112. 路径总和、106.从中序与后序遍历序列构造二叉树

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同理。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容