二叉树

2022-06-24  本文已影响0人  Eden0503

https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/solution/dai-ma-sui-xiang-lu-dai-ni-xue-tou-er-ch-uq84/

[TOC]

二叉树的遍历方式

144. 二叉树的前序遍历【简单】


// https://leetcode.cn/problems/binary-tree-preorder-traversal/solution/dai-ma-sui-xiang-lu-chi-tou-qian-zhong-hou-xu-de-d/
// 前序遍历是根左右,每次先处理的是中间节点,那么先将跟节点放入栈中,然后将右孩子加入栈,再加入左孩子。
//为什么要先加入 右孩子,再加入左孩子呢? 因为这样出栈的时候才是中左右的顺序。
func preorderTraversal(root *TreeNode) []int {
    ans := make([]int, 0)
    stack := []*TreeNode{root}
    for len(stack) != 0 {
        node := stack[len(stack)-1]
        fmt.Println(node)
        if node == nil {
            stack = stack[:len(stack)-1]
            continue
        }
        ans = append(ans, node.Val)
        stack = stack[:len(stack)-1]      // 栈顶元素出来
        stack = append(stack, node.Right) // 先压栈右节点,再压左节点
        stack = append(stack, node.Left)
    }
    return ans
}

145. 二叉树的后序遍历【简单】

94. 二叉树的中序遍历【简单】

102. 二叉树的层序遍历【中等】


// ============== 解法一: BFS 迭代实现,广度优先遍历 ================
func levelOrder(root *TreeNode) (res [][]int) {
    if root == nil {
        return res
    }
    queue := []*TreeNode{root}
    for len(queue) != 0 {
        var curLevel []int
        size := len(queue)
    
        for i := 0; i < size; i++ {
            node := queue[0]
            curLevel = append(curLevel, node.Val)

            if node.Left != nil {
                queue = append(queue, node.Left)
            }
            if node.Right != nil {
                queue = append(queue, node.Right)
            }
            queue = queue[1:]
        }
        res = append(res, curLevel)
    }

    return res
}

二叉树的属性

101. 对称二叉树【简单】

104. 二叉树的最大深度【简单】


//**************** 解法一(递归走起)********************************

func maxDepth(root *TreeNode) int {
    if root == nil {
        return 0
    }
    left := maxDepth(root.Left)                             // 左子树的最大深度
    right := maxDepth(root.Right)                           // 右子树的最大深度
    return int(math.Max(float64(left), float64(right)) + 1) // 深度加上根节点

}

//**************** 解法二(迭代法走起)********************************

func maxDepth(root *TreeNode) int {
    if root == nil {
        return 0
    }
    queue := []*TreeNode{root} // 辅助队列,根节点入队
    depth := 0                 // 初始化深度为0

    for len(queue) > 0 { // 当队列不为空时,循环以下操作
        size := len(queue)          //当前队列中元素个数size作为限定:当前层级中节点数量
        for i := 0; i < size; i++ { // 遍历当前层级中的节点
            s := queue[0]      // 获取队首元素
            if s.Left != nil { // 如果左子树不为空,左子树入队
                queue = append(queue, s.Left)
            }
            if s.Right != nil { // 如果右子树不为空,右子树入队
                queue = append(queue, s.Right)
            }
            queue = queue[1:] // 队首元素出队
        }
        depth++ // for循环结束后这一层级节点已经访问结束,深度加+1
    }
    return depth
}

111. 二叉树的最小深度【简单】

// ============== 解法一: BFS 迭代实现,广度优先遍历 ================
// https://www.cnblogs.com/Lusai/p/15709094.html
func minDepth(root *TreeNode) int {
    if root == nil {
        return 0
    }
    var queue []*TreeNode       // 查找队列
    queue = append(queue, root) // 将起点加入队列
    depth := 1                  // root 本身就是一层,depth初始化为1
    for len(queue) != 0 {
        size := len(queue)
        // 将当前队列中的所有结点向四周扩散
        for i := 0; i < size; i++ {
            cur := queue[0]
            // 判断是否到终点
            if cur.Left == nil && cur.Right == nil {
                return depth
            }
            // 将 cur的相邻节点加入队列
            if cur.Left != nil {
                queue = append(queue, cur.Left)
            }
            if cur.Right != nil {
                queue = append(queue, cur.Right)
            }
            // 去掉当前节点
            queue = queue[1:]
        }
        // 这里增加步数
        depth++
    }
    return depth
}

// ============== 解法二: DFS   ================

func minDepth(root *TreeNode) int {
    if root == nil {
        return 0
    }
    if root.Left != nil && root.Right == nil {
        return 1 + minDepth(root.Left)
    }
    if root.Right != nil && root.Left == nil {
        return 1 + minDepth(root.Right)
    }
    return 1 + Min(minDepth(root.Left), minDepth(root.Right))
}

222. 完全二叉树的节点个数(中等)

110. 平衡二叉树(中等)

257. 二叉树的所有路径(简单)

404. 左叶子之和【简单】

513. 找树左下角的值【中等】

112. 路径总和【简单】

二叉树的修改和构造

226. 翻转二叉树【简单】

106. 从中序与后序遍历序列构造二叉树 (中等)

654. 最大二叉树(中等)

617. 合并二叉树【简单】

求二叉搜索树的属性

98. 验证二叉搜索树

501. 二叉搜索树中的众数(简单)

530. 二叉搜索树的最小绝对差

538. 把二叉搜索树转换为累加树(中等)

700. 二叉搜索树中的搜索(简单)

二叉树公共祖先问题

235. 二叉搜索树的最近公共祖先(简单)

236. 二叉树的最近公共祖先(中等)

二叉搜索树的修改和改造

108. 将有序数组转换为二叉搜索树(简单)

450. 删除二叉搜索树中的节点(中等)

669. 修剪二叉搜索树(中等)

701. 二叉搜索树中的插入操作(中等)

上一篇下一篇

猜你喜欢

热点阅读