【递归三部曲「图解过程」】
2022年5月30日 08:02
思路分析:
本题最直观的思路就是直接递归遍历即可:按照访问根节点——左子树——右子树——的方式遍历这棵树,而在访问左子树或者右子树的时候,我们按照同样的方式遍历,直到遍历完整棵树。
实现步骤:
-
确定递归函数的参数和返回值: 因为本题需要递归遍历每个节点而且当前节点的计算用到了上次计算的结果,所以函数返回值是 计算结果值; -
确定终止条件: 当然是当前遍历的节点是空了,那么本层递归就要要结束了,所以如果当前遍历的这个节点是空,就直接 $return$ $0$; -
确定单层递归的逻辑:- 如果节点是叶子节点,返回它对应的数字 $sum$;
- 如果节点是非叶子节点,返回它的左子树和右子树对应的结果之和;
【图解举例】![]()
具体代码如下:
###C++
class Solution {
public:
int traserval(TreeNode *root, int sum) {
if(root == NULL) return 0;
sum = (sum << 1) | root->val;
if(!root->left && !root->right) return sum;
int leftVal = traserval(root->left, sum);
int rightVal = traserval(root->right, sum);
return leftVal + rightVal;
}
int sumRootToLeaf(TreeNode* root) {
return traserval(root, 0);
}
};
复杂度分析:
- 时间复杂度:$O(n)$,其中 $n$ 是二叉搜索树的节点数;
- 空间复杂度:$O(n)$。