(Leetcode 刷題)把二叉搜索樹轉(zhuǎn)換為累加樹

題目描述

給定一個二叉搜索樹(Binary Search Tree),把它轉(zhuǎn)換成為累加樹(Greater Tree),使得每個節(jié)點的值是原來的節(jié)點值加上所有大于它的節(jié)點值之和。
538. 把二叉搜索樹轉(zhuǎn)換為累加樹

解法1 迭代

首先明確我們的目的:使得每個節(jié)點的值是原來的節(jié)點值加上所有大于它的節(jié)點值之和。
然后注意到輸入的樹是一棵二叉搜素樹,二叉搜索樹的每個節(jié)點值都大于它左邊的所有節(jié)點值,小于它右邊的所有節(jié)點值。
因此,我們可以從最右邊的節(jié)點開始,累加節(jié)點的值存放于sum,每移動到下一個節(jié)點,將sum再加上該節(jié)點的值并賦給它本身。這一思路要求我們的節(jié)點遍歷順序是從右往左走。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 * int val;
 * TreeNode left;
 * TreeNode right;
 * TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode convertBST(TreeNode root) {
        if (root == null) {
            return root;
        }
        int sum = 0;
        LinkedList<TreeNode> stack = new LinkedList<>();
        TreeNode curr = root;
        while (!stack.isEmpty() || curr != null) {
            //到達最右邊的節(jié)點
            while (curr != null) {
                stack.push(curr);
                curr = curr.right;
            }
            curr = stack.pop();
            //累加值到sum上
            sum += curr.val;
            //賦值給當前節(jié)點
            curr.val = sum;
            //下一個節(jié)點
            curr = curr.left;
        }
        return root;
    }
}

解法2 回溯

同樣的思路。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 * int val;
 * TreeNode left;
 * TreeNode right;
 * TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    //num需要是全局遍歷,如果在convertBST函數(shù)體內(nèi),遞歸回上一層num會改變。
    int num = 0;

    public TreeNode convertBST(TreeNode root) {
        if (root == null) {
            return null;
        }
        root.right = convertBST(root.right);
        num += root.val;
        root.val = num;
        root.left = convertBST(root.left);
        return root;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容