每日一题---从二叉搜索树到更大和树

每日一题—从二叉搜索树到更大和树

给出二叉搜索树的根节点,该二叉树的节点值各不相同,修改二叉树,使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

提醒一下,二叉搜索树满足下列约束条件:

  • 节点的左子树仅包含键小于节点键的节点。

  • 节点的右子树仅包含键大于节点键的节点。

  • 左右子树也必须是二叉搜索树。

    示例:

https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2019/05/03/tree.png

输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

题目图解:

在这里插入图片描述在这里插入图片描述

键的中序遍历:0,1,2,3,4,5,6,7,8

值的中序遍历:36,36,35,33,30,26,21,15,8

分析后,发现值的中序遍历是对应键的中序遍历的逆向之和

如:15=8+7,21=8+7+6依此类推

代码如下:

package cn.lbl.face.leetCode;

class TreeNode {
    
    
      int val;
      TreeNode left;
      TreeNode right;
      TreeNode(int x) {
    
     val = x; }
  }

public class  从二叉搜索树到更大和树{
    
    
    static int sum = 0;
    public static TreeNode bstToGst(TreeNode root) {
    
    
        if(root != null){
    
    
            bstToGst(root.right);
            sum = sum + root.val;
            root.val = sum;
            bstToGst(root.left);
        }
        return root;
    }

    public static void main(String[] args) {
    
    
        TreeNode treeNode0 = new TreeNode(0);
        TreeNode treeNode1 = new TreeNode(1);
        TreeNode treeNode2 = new TreeNode(2);
        TreeNode treeNode3 = new TreeNode(3);
        TreeNode treeNode4 = new TreeNode(4);
        TreeNode treeNode5 = new TreeNode(5);
        TreeNode treeNode6 = new TreeNode(6);
        TreeNode treeNode7 = new TreeNode(7);
        TreeNode treeNode8 = new TreeNode(8);
        treeNode4.left=treeNode1;
        treeNode4.right=treeNode6;
        treeNode1.left=treeNode0;
        treeNode1.right=treeNode2;
        treeNode6.left=treeNode5;
        treeNode6.right=treeNode7;
        treeNode2.right=treeNode3;
        treeNode7.right=treeNode8;
        bstToGst(treeNode4);
    }
}

效果如下:
在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_37924905/article/details/108545395