算法日志 --- 12.05---把二叉搜索树转换为累加树

91 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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;
    }

image.png