美文网首页LeetCode By Go
[LeetCode By Go 27]538. Convert

[LeetCode By Go 27]538. Convert

作者: miltonsun | 来源:发表于2017-08-18 18:43 被阅读6次

    二叉树的题目挺多的,写了个初始化二叉树的函数,以后用

    func InitTree(index int, input []int) (t *TreeNode) {
        if index > len(input) {
            return nil
        }
    
        t = new(TreeNode)
        t.Val = input[index - 1]
    
        t.Left = InitTree(index*2, input)
        t.Right = InitTree(index*2 + 1, input)
    
        return t
    }
    

    题目

    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
    

    解题思路

    二叉搜索树要求:每个节点都不比它左子树的任意元素小,而且不比它的右子树的任意元素大。
    由大到小遍历二叉搜索树(右,中,左)二叉搜索树,题目要求操作就是该逆序遍历的当前节点加上之前所有节点的和。

    因此,在逆序遍历的同时,累加得到一个总值sum,每个节点值加上这个总值
    总值为全局变量,初始为0

    代码

    convertBST.go

    package _538_Convert_BST_to_Greater_Tree
    
    /**
     * Definition for a binary tree node.
     * type TreeNode struct {
     *     Val int
     *     Left *TreeNode
     *     Right *TreeNode
     * }
     */
    
    type TreeNode struct {
        Val   int
        Left  *TreeNode
        Right *TreeNode
    }
    
    var sum int
    func ReverseOrderAdd(t *TreeNode, add int){
        if nil == t {
            return
        }
    
        ReverseOrderAdd(t.Right, add)
        t.Val += sum
        sum = t.Val
        ReverseOrderAdd(t.Left, sum)
    
    }
    func ConvertBST(root *TreeNode) *TreeNode {
        sum = 0
        ReverseOrderAdd(root, 0)
    
        return root
    }
    

    测试

    convertBST_test.go

    package _538_Convert_BST_to_Greater_Tree
    
    import (
        "testing"
        "fmt"
    )
    
    func InitTree(index int, input []int) (t *TreeNode) {
        if index > len(input) {
            return nil
        }
    
        t = new(TreeNode)
        t.Val = input[index - 1]
    
        t.Left = InitTree(index*2, input)
        t.Right = InitTree(index*2 + 1, input)
    
        return t
    }
    
    func MiddleOrder(t *TreeNode) {
        if nil == t {
            return
        }
    
        MiddleOrder(t.Left)
        fmt.Printf("%+v, ", t.Val)
        MiddleOrder(t.Right)
    }
    
    func TestConvertBST(t *testing.T) {
    
        input1 := []int{5, 2, 13}
        tree1 := InitTree(1, input1)
    
        input2 := []int{2,1,3}
        tree2 := InitTree(1, input2)
    
        var tests = []struct{
            root *TreeNode
        }{
            {tree1,},
            {tree2,},
        }
    
        for _, v := range tests {
            MiddleOrder(v.root)
            fmt.Println()
            ConvertBST(v.root)
    
            MiddleOrder(v.root)
            fmt.Println()
        }
    }
    

    相关文章

      网友评论

        本文标题:[LeetCode By Go 27]538. Convert

        本文链接:https://www.haomeiwen.com/subject/kboarxtx.html