【LeetCode专项】二叉树

50 阅读1分钟

144. 二叉树的前序遍历

代码

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func preorderTraversal(root *TreeNode) []int {
    ans := []int{}
    if root==nil {
        return ans
    }
    tmp := []*TreeNode{root}
    var now *TreeNode

    for len(tmp)!=0 {
        now = tmp[len(tmp)-1]
        tmp = tmp[:len(tmp)-1]

        ans = append(ans, now.Val)

        if now.Right != nil {
            tmp = append(tmp, now.Right)
        }
        if now.Left != nil {
            tmp = append(tmp, now.Left)
        }
    }
    return ans
}

思路

  • 自己举个例子画一下就可以
  • 先放右边子节点的栈

性能

  • 时间复杂度:O(n)
  • 空间复杂度:O(n),需要储存每个元素

94. 二叉树的中序遍历

代码

func inorderTraversal(root *TreeNode) []int {
    ans := []int{}

    var dfs func(now *TreeNode)
    dfs = func(now *TreeNode) {
        if now==nil {
            return
        }

        dfs(now.Left)
        ans = append(ans, now.Val)
        dfs(now.Right)
    }

    dfs(root)
    return ans
}

思路

  • 深度优先,先遍历左边,插入,再遍历右边

性能

  • 时间复杂度:O(n)
  • 空间复杂度:O(n),需要储存每个元素

145. 二叉树的后序遍历

代码

func postorderTraversal(root *TreeNode) []int {
    ans := []int{}

    var dfs func(now *TreeNode)
    dfs = func(now *TreeNode) {
        if now==nil {
            return
        }
        dfs(now.Left)
        dfs(now.Right)
        ans = append(ans, now.Val)
    }

    dfs(root)
    return ans
}

思路

  • 深度优先,先遍历左边,再遍历右边,最后插入

性能

  • 时间复杂度:O(n)
  • 空间复杂度:O(n),需要储存每个元素