剑指 Offer II 054. 所有大于等于节点的值之和

题目.png

题意:给定一个二叉搜索树,请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。
提醒一下,二叉搜索树满足下列约束条件:
节点的左子树仅包含键 小于 节点键的节点。
节点的右子树仅包含键 大于 节点键的节点。
左右子树也必须是二叉搜索树。

解法:
1.二叉搜索树中序遍历的结果为递增序列
2.求取二叉搜索树的和
3.我们知道list为递增的序列,那么只需要算出每个元素之后的元素的和,就是当前位置所求的值
4.根据sc递增数组,中序遍历赋值,构造二叉搜索树

解题遇到的问题

后续需要总结学习的知识点

##解法1
import java.util.ArrayList;
import java.util.List;

class Solution {
    List list = new ArrayList();
    int currentIndex = 0;
    public TreeNode convertBST(TreeNode root) {
        if (root == null) {
            return null;
        }

        // 二叉搜索树中序遍历的结果为递增序列
        midTree(root);
        int sum = 0;
        // 求取二叉搜索树的和
        for (int i = 0; i < list.size(); i++) {
            sum += list.get(i);
        }
        int[] sc = new int[list.size()];
        sc[0] = sum;
        // 我们知道list为递增的序列,那么只需要算出每个元素之后的元素的和,就是当前位置所求的值
        for (int i = 1; i < list.size(); i++) {
            sc[i] = sum - list.get(i - 1);
            sum = sc[i];
        }

        // 根据sc递增数组,中序遍历赋值,构造二叉搜索树
        TreeNode temp = root;
        productTree(sc, temp);
        return root;
    }

    private void productTree(int[] sc, TreeNode root) {
        if (root == null) {
            return;
        }

        productTree(sc, root.left);
        root.val = sc[currentIndex++];
        productTree(sc, root.right);
    }

    private void midTree(TreeNode root) {
        if (root == null) {
            return;
        }
        midTree(root.left);
        list.add(root.val);
        midTree(root.right);
    }

    public 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;
        }
    }
}

你可能感兴趣的:(剑指 Offer II 054. 所有大于等于节点的值之和)