zoukankan      html  css  js  c++  java
  • 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
                 
                
     
  • 相关阅读:
    ZOJ2402 Lenny's Lucky Lotto List 简单DP
    HDU1024 最大M子段和问题 (单调队列优化)
    HDU2048 HDU2049 组合数系列 错排
    HDU1081 最大字段和 压缩数组(单调队列优化)
    HDU1166 数状数组
    HDU1085 多重背包
    HDU3062
    递归 递推 规律
    【机器学习PAI实战】—— 玩转人工智能之美食推荐
    阿里开源自用 OpenJDK 版本,Java 社区迎来中国力量
  • 原文地址:https://www.cnblogs.com/bonelee/p/8641726.html
Copyright © 2011-2022 走看看