开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第15天,点击查看活动详情
日复一日,年复一年,又是一周的轮回,又是周一
把二叉搜索树转换为累加树
该题出自力扣的538题 —— 把二叉搜索树转换为累加树【中等题】,这道题和1038题是一样的
审题
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下,二叉搜索树满足下列约束条件:
- 节点的左子树仅包含键 小于 节点键的节点。
- 节点的右子树仅包含键 大于 节点键的节点。
- 左右子树也必须是二叉搜索树。
- 这道虽然是中等题,但其实懂了的话就是一道简单题,因为考察的是二叉树的基础知识
- 首先给出一颗搜索树,也就是左节点比根节点小,右节点比跟节点大,要求返回一个累加树,当前节点替换成比当前节点大的值的和
- 那么结合搜索树的特征就很好理解了,只要把右节点相加即可,那么右节点也需要不断往右节点去累加
- 需要深度遍历,从树的右节点 → 根节点 → 左节点,这样的顺序
- 当前节点相加右节点就等于是累加
- 反序中序遍历该二叉搜索树,记录过程中的节点值之和,并不断更新当前遍历到的节点的节点值
- 需要注意的是,System.out.println这个方法就不要使用,因为会导致性能极差 0ms 变成33.4ms就是一句打印造成的
编码
class Solution {
int res = 0;
public TreeNode convertBST(TreeNode root) {
dfs(root);
return root;
}
public void dfs(TreeNode root){
if (root == null){
return;
}
dfs(root.right);
// System.out.println(res += root.val);
root.val = res += root.val;
dfs(root.left);
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {
}
TreeNode(int val) {
this.val = val;
}
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}