代码随想录算法训练营第十七天(优先递归)|110.平衡二叉树, 257. 二叉树的所有路径,404.左叶子之和

110.平衡二叉树

力扣

1. 求高度相关 - 后序遍历:左右中,即先左右递归后,再进行中间计算差值的操作

2. 如何判断平衡二叉树:左子树高度和其右子树高度的差值如果大于1,就不是平衡的了

3. 终止条件:每道关于树的题都要考虑一下root == nullptr时具体是什么情况!比如求height的时候,该点为nullptr则height = 0。求左右树difference的时候,如果该点为nullptr,diff = 0.

本题的终止条件依然是if (root == nullptr) return 0,node为nullptr的话,左子树和右子树的difference也是0。

4.本题的“要查一下”就是当前leftHeight和rightHeight是不是已经是-1(即不平衡了),如果是的话直接return -1。这个内容写在最前面。这也是和纯计算tree height不一样的地方。

5. 所有的递归过程(比如当前的左-右)都放到helper function里写,别在main function里也写一些递归,容易弄混

 

 

257. 二叉树的所有路径

力扣

1. 路径是从root到leaf,所以要用前序遍历 pre-order(和求深度一样)。

⚠️:注意最开始要先path.push_back(curr->val),要不然当前节点不在里面。

2. 终止条件:找到叶子节点,就可以往回进行回溯了,即:

if(cur->left == nullptr && cur->right == nullptr)

 到叶子节点后,我们已经有一个vector<int>来记录这条路上的点,需要在这里做的就是转化成“1->2->5"这种string形式就可以。

具体转化过程:

 

3. 递归过程 - 回溯:具体在于收集完一条路的节点后,要都弹出去,回到root,再收集下一条路。

注意一个递归对应一个回溯,是在一个花括号里!

if(curr->left){
    traversal(curr->left, path, result);
    path.pop_back();
}

if(curr->right){
    traversal(curr->right, path, result);
    path.pop_back();
}

4. 注意!helper function的input一定是pass by reference:

void traversal(TreeNode* curr, vector<int>& path, vector<string>& result)

这样在main function里引用的时候才能有效改变result和path。返回类型是void

还有一个用string的方法我觉得也不错。最开始c = "", 最后需要剔掉最前面的"->"。

 

 

 

 

404.左叶子之和 

 力扣

1. 如何判断是不是“左叶子”:是parent的left child,且是leaf(左右皆为nullptr)

if(node->left != nullptr && node->left->left == nullptr && node->left->right == nullptr)

需要借助一下parent node,如果满足以上条件,那么node->left就是“左叶子”。

2. 可以把int sum = 0放在方法的外面。如果遇到“左叶子”(上述的if)才加到sum中。这样sum就不会被每次更新。

3. 左右递归时,不用返回int(虽然方法是要的),直接

sumofLeftLeaves(root->left);
sumofLeftLeaves(root->right);

这样不容易混。sum仅在是“左叶子”的时候更新

4. 别忘了处理特殊情况:

if(root == nullptr) return 0;
if(root->left == nullptr && root->right == nullptr) return 0;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值