每日一题—从二叉搜索树到更大和树
给出二叉搜索树的根节点,该二叉树的节点值各不相同,修改二叉树,使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。
提醒一下,二叉搜索树满足下列约束条件:
-
节点的左子树仅包含键小于节点键的节点。
-
节点的右子树仅包含键大于节点键的节点。
-
左右子树也必须是二叉搜索树。
示例:
输入:[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);
}
}
效果如下: