二叉树之前序遍历|Go主题月

1,748 阅读1分钟

【Golang主题学习月】 刷题比玩游戏好多了,成就感越来越强,每天坚持刷一道题,每天锻炼30分钟,等8块腹肌,等大厂offer.

😄

 \color{red}{~}

我相信,如果在面试中遇到此题,逻辑清晰、正确表达出来、手撕

应该会超过一部分的面试者。

leecode 144. 二叉树的前序遍历

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

图片.png

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

示例 2:

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

示例 3:

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

示例 4:

图片.png 输入:root = [1,2] 输出:[1,2]

示例 5:

图片.png

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

提示:

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


首先我们需要了解什么是二叉树的前序遍历:按照访问根节点——左子树——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候,我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。

参考代码

定义一颗树

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int          // 根
 *     Left *TreeNode   //左节点
 *     Right *TreeNode  //右节点
 * }
 */

GO语言版 递归

func preorderTraversal(root *TreeNode) (vals []int) {
    var preorder func(*TreeNode)
    preorder = func(node *TreeNode) {
        if node == nil {
            return
        }
        vals = append(vals, node.Val) // 添加根节点
        preorder(node.Left)  // 直接怼到左边最下边 添加左节点
        preorder(node.Right) // 看右边还有没有分支,有就继续走,没有就将根节点加入数组
    }
    preorder(root)
    return
}


GO语言版 迭代 栈:先进后出

定义一个栈,栈存的就是一棵树

1.先将根节点怼进数组

2.把整棵树怼进栈

3.遍历把左子树全部怼进栈,知道最下面的左节点。

4.把最下面的左子树从栈里面弹出来,不为空就先把根节点怼进数组,在重复2步骤。

func preorderTraversal(root *TreeNode) (vals []int) {
    stack := []*TreeNode{}
    node := root
    for node != nil || len(stack) > 0 {
        for node != nil {
            vals = append(vals, node.Val)  // 1
            stack = append(stack, node)  // 2
            node = node.Left // 3
        }
        node = stack[len(stack)-1].Right
        stack = stack[:len(stack)-1]  // 4
    }
    return
}


真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️