LeetCode刷题Python3之二叉树前序遍历

二叉树的前序遍历

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

示例 1:
在这里插入图片描述

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

提示:

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

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

具体实现

在这里插入图片描述

根据前序遍历的访问顺序:

对于节点A而言,顺序为ABC
对于节点B而言,顺序为BDE
对于节点C而言,顺序为C
对于节点D而言,顺序为DF
对于节点E而言,顺序为EG
结合起来就是A[B[DF][EG]]C

综上所述前序遍历最终结果为ABDFEGC

解释

二叉树的前序遍历,就是:
首先遍历根节点;
然后按照前序遍历的顺序访问根节点的左子树;
再按照前序遍历的顺序访问根节点的右子树。

解法一

核心思想:递归求解二叉树

需要知道前序遍历顺序是根->左->右

递归需要注意的地方:递归的三要素

  • 递归必须有结束条件
  • 递归是将问题更小化
  • 主函数必须调用递归函数

以下面代码作为例子

11行 if root:作为结束条件
13行14行 使问题更小化
15行 主函数调用该递归函数

满足这3个条件,问题解决!!!
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        arr=[]
        def preorder(root:TreeNode,arr:List[int]):
            if root:
                arr.append(root.val)
                preorder(root.left,arr)
                preorder(root.right,arr)
        preorder(root,arr)
        return arr

解法二

核心思想:非递归求解二叉树(迭代法),在C,Java,C++等语言可能需要使用栈,但是在python中可以使用列表来代替栈。

这是因为列表有pop函数,删除最后一个元素,并返回。这就是其他语言的出栈并获取该元素的操作

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        stack=[]
        arr=[]
        #根节点不为空或栈不为空
        while root or stack:
        	#如果根节点不为空
            while root:
            	#进栈,并将节点的左子树节点作为根节点
                arr.append(root.val)
                stack.append(root)
                root=root.left
            #如果栈不为空
            if stack:
            	#出栈,并将节点的右子树节点作为根节点
                root=stack.pop()
                root=root.right
        return arr

用上面那个图对非递归进行解释
在这里插入图片描述

栈不为空或树不为空
A进栈,B进栈,D进栈,D没有左子树
D出栈,节点为D的右子树F

栈不为空或树不为空
F进栈,无左子树
F出栈,无右子树

栈不为空或树不为空
F右子树为空,无进栈
B出栈,节点为B的右子树E

栈不为空或树不为空
E进栈,G进栈,G没有左子树
G出栈,G没有右子树

栈不为空或树不为空
G右子树为空,无进栈
E出栈,E没有右子树

栈不为空或树不为空
E没有右子树,无进栈
A出栈,A的右子树为C

栈不为空或树不为空
C进栈,C没有左子树
C出栈,C没有右子树

栈为空且树为空,退出

进栈顺序为:ABDFEGC
也就是前序遍历

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值