Golang每日一练(leetDay0032) 二叉树专题(1)

目录

94. 二叉树的中序遍历 Binary Tree Inorder Traversal  

95. 不同的二叉搜索树 II Unique Binary Search Trees II  

96. 不同的二叉搜索树 Unique Binary Search Trees  

每日一练刷题专栏 

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


二叉树专题(1)

94. 二叉树的中序遍历 Binary Tree Inorder Traversal

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

示例 1:

Golang每日一练(leetDay0032) 二叉树专题(1)_第1张图片

输入:root = [1,null,2,3]
输出:[1,3,2]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

提示:

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

代码1: 递归法

type TreeNode struct {
    Val int
    Left *TreeNode
    Right *TreeNode
}

func inorderTraversal(root *TreeNode) []int {
    var res []int
    inorder(root, &res)
    return res
}

func inorder(root *TreeNode, res *[]int) {
    if root == nil {
        return
    }
    inorder(root.Left, res)
    *res = append(*res, root.Val)
    inorder(root.Right, res)
}

代码2: 迭代法

type TreeNode struct {
    Val int
    Left *TreeNode
    Right *TreeNode
}

func inorderTraversal(root *TreeNode) []int {
    var res []int
    stack := []*TreeNode{}
    cur := root
    for cur != nil || len(stack) > 0 {
        for cur != nil {
            stack = append(stack, cur)
            cur = cur.Left
        }
        cur = stack[len(stack)-1]
        stack = stack[:len(stack)-1]
        res = append(res, cur.Val)
        cur = cur.Right
    }
    return res
}

95. 不同的二叉搜索树 II Unique Binary Search Trees II

给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。

示例 1:

Golang每日一练(leetDay0032) 二叉树专题(1)_第2张图片

输入:n = 3
输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]

示例 2:

输入:n = 1
输出:[[1]]

提示:

  • 1 <= n <= 8

代码1: 递归法

type TreeNode struct {
    Val int
    Left *TreeNode
    Right *TreeNode
}

func generateTrees(n int) []*TreeNode {
    if n == 0 {
        return []*TreeNode{}
    }
    return generate(1, n)
}

func generate(start, end int) []*TreeNode {
    if start > end {
        return []*TreeNode{nil}
    }
    var res []*TreeNode
    for i := start; i <= end; i++ {
        left := generate(start, i-1)
        right := generate(i+1, end)
        for _, l := range left {
            for _, r := range right {
                res = append(res, &TreeNode{i, l, r})
            }
        }
    }
    return res
}

代码2: 动态规划

type TreeNode struct {
    Val int
    Left *TreeNode
    Right *TreeNode
}

func generateTrees(n int) []*TreeNode {
    if n == 0 {
        return []*TreeNode{}
    }
    dp := make([][]*TreeNode, n+1)
    dp[0] = []*TreeNode{nil}
    for i := 1; i <= n; i++ {
        var res []*TreeNode
        for j := 1; j <= i; j++ {
            for _, l := range dp[j-1] {
                for _, r := range dp[i-j] {
                    res = append(res, &TreeNode{j, l, r})
                }
            }
        }
        dp[i] = res
    }
    return dp[n]
}

96. 不同的二叉搜索树 Unique Binary Search Trees

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 

示例 1:

Golang每日一练(leetDay0032) 二叉树专题(1)_第3张图片

输入:n = 3
输出:5

示例 2:

输入:n = 1
输出:1

提示:

  • 1 <= n <= 19

代码1: 动态规划

func numTrees(n int) int {
    dp := make([]int, n+1)
    dp[0] = 1
    for i := 1; i <= n; i++ {
        for j := 1; j <= i; j++ {
            dp[i] += dp[j-1] * dp[i-j]
        }
    }
    return dp[n]
}

代码2: 组合

卡特兰数Cn满足以下递推式: C0 = 1, Cn+1 = 2(2n+1)/(n+2) * Cn

func numTrees(n int) int {
    c := 1
    for i := 0; i < n; i++ {
        c = c * 2 * (2*i+1) / (i+2)
    }
    return c
}


每日一练刷题专栏 

持续,努力奋斗做强刷题搬运工!

点赞,你的认可是我坚持的动力! 

 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/ 

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏

你可能感兴趣的:(#,Golang每日一练,刷题专栏,golang,leetcode,中序遍历,二叉搜索树)