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;