leetcode 538. Convert BST to Greater Tree

Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original BST is changed to the original key plus sum of all keys greater than the original key in BST.

Example:

Input: The root of a Binary Search Tree like this:
              5
            /   \
           2     13

Output: The root of a Greater Tree like this:
             18
            /   \
          20     13

 

解法1:

tree遍历顺序,right->root->left,这样tree 节点按照从大到小顺序遍历。

为了不改变原来的tree,先copy下:

复制代码
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def convertBST(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        """
use right->root->left order traverse
when for this node, node.val += last_traver_node.val
        """ 
        if not root: return None
        
        def copy_node(root):
            if not root: return None
            r = TreeNode(root.val)
            r.left = copy_node(root.left)
            r.right = copy_node(root.right)
            return r
            
        new_root = copy_node(root)
        
        q = []
        node = new_root
        last_node = None
        while node:
            q.append(node)            
            node = node.right         
        while q:
            n = q.pop() # right->root->left
            if last_node:                
                n.val += last_node.val
            last_node = n
            node = n.left
            while node:
                q.append(node)
                node = node.right
        return new_root                        
复制代码

如果是允许修改原来的tree则:

复制代码
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def convertBST(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        """
use right->root->left order traverse
when for this node, node.val += last_traver_node.val
        """ 
        if not root: return None                
        q = []
        node = root
        last_node = None
        while node:
            q.append(node)            
            node = node.right         
        while q:
            n = q.pop() # right->root->left
            if last_node:                
                n.val += last_node.val
            last_node = n
            node = n.left
            while node:
                q.append(node)
                node = node.right
        return root                        
复制代码

解法3,DFS,使用python3 利用闭包搞定:

复制代码
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def convertBST(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        """
use right->root->left order traverse
when for this node, node.val += last_traver_node.val
        """ 
        last_node = None
        def dfs(node):
            if not node: return None
            dfs(node.right)
            nonlocal last_node
            node.val += (last_node and last_node.val or 0)
            last_node = node
            dfs(node.left)
            return node
        
        return dfs(root)                         
复制代码

使用一个闭包变量跟踪迭代的每一个node!

 最后一种解法是Morris Traversal

    public TreeNode convertBST(TreeNode root) {
        TreeNode cur= root;
        int sum = 0;
        while (cur != null) {
            if (cur.right == null) {
                int tmp = cur.val;
                cur.val += sum;
                sum += tmp;
                cur = cur.left;
            } else {
                TreeNode prev = cur.right;
                while (prev.left != null && prev.left != cur)
                    prev = prev.left;
                if (prev.left == null) {
                    prev.left = cur;
                    cur = cur.right;
                } else {
                    prev.left = null;
                    int tmp = cur.val;
                    cur.val += sum;
                    sum += tmp;
                    cur = cur.left;
                }
            }
        }
        return root;
    }


其他解法,没有太懂。。。
复制代码
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def convertBST(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        def dfs(node, sum_val):
            if not node: return sum_val
            val = dfs(node.right, sum_val)
            node.val += val
            return dfs(node.left, node.val)

        dfs(root, 0)
        return root
             
            
复制代码

 

 
posted @   bonelee  阅读(202)  评论(1编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2017-03-24 lucene倒排索引瘦身的一些实验——merge的本质是减少cfx文件 变为pos和doc;存储term vector多了tvx和tvd文件有337M
点击右上角即可分享
微信分享提示