LeetCode 94、144、145*. 二叉树的遍历(Python)

简介: 给定一个二叉树,返回它的 前序 遍历。

给定一个二叉树,返回它的前序遍历。


示例:


输入: [1,null,2,3]  


1

  \

    2

  /

3


输出: [1,2,3]



思路:


递归很简单,这里用迭代法,使用栈模拟计算机中的指令执行情况。


1. 先创建一个Command类,存储一个字符串和一个树节点,其中字符串表示什么命令,“go”代表跳转到某个节点,“print”表示打印输出;


2. 由于是先序遍历,所以跳转到某个节点时先从栈顶弹出一条命令执行;


3. 如果弹出的命令是“print”则append进结果,如果是go命令则先向栈中压入“go” Command中存储的节点的右子节点命令,再压入“go” Command中存储的节点的左子节点命令,最后压入“print” Command中存储的节点的命令;


4. 最终返回结果数据即可


# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Command(object):
    def __init__(self, s, node):
        self.s = s
        self.node = node
class Solution(object):
    def preorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if root == None:
            return []
        stack = []
        result = []
        stack.append( Command("go", root) )
        while len(stack)!= 0:
            command = stack.pop()
            if command.s == "print":
                result.append(command.node.val)
            else:
                if command.s == "go" and command.node.right:
                    stack.append( Command("go", command.node.right) )
                if command.s == "go" and command.node.left:
                    stack.append( Command("go", command.node.left) )
                stack.append( Command("print", command.node) )
        return result


对于第94题的中序遍历,只需改变入栈顺序即可


# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Command(object):
    def __init__(self, s, node):
        self.s = s
        self.node = node
class Solution(object):
    def inorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if root == None:
            return []
        stack = []
        result = []
        stack.append( Command("go", root) )
         while len(stack)!= 0:
            command = stack.pop()
            if command.s == "print":
                result.append(command.node.val)
            else:
                if command.s == "go" and command.node.right:
                    stack.append( Command("go", command.node.right) )
                stack.append( Command("print", command.node) )
                if command.s == "go" and command.node.left:
                    stack.append( Command("go", command.node.left) )
        return result


对于第145题的后序遍历,只需改变入栈顺序即可


# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Command(object):
    def __init__(self, s, node):
        self.s = s
        self.node = node
class Solution(object):
    def postorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if root == None:
            return []
        stack = []
        result = []
        stack.append( Command("go", root) )
        while len(stack)!= 0:
            command = stack.pop()
            if command.s == "print":
                result.append(command.node.val)
            else:
                stack.append( Command("print", command.node) )
if command.s == "go" and command.node.right:
                    stack.append( Command("go", command.node.right) )
                if command.s == "go" and command.node.left:
                    stack.append( Command("go", command.node.left) )
        return result


相关文章
|
11天前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
42 5
|
2月前
|
算法 定位技术 Python
震惊!Python 图结构竟然可以这样玩?DFS&BFS 遍历技巧大公开
在 Python 编程中,图是一种重要的数据结构,而深度优先搜索(DFS)和广度优先搜索(BFS)是遍历图的两种关键算法。本文将通过定义图的数据结构、实现 DFS 和 BFS 算法,并通过具体示例展示其应用,帮助读者深入理解这两种算法。DFS 适用于寻找路径和检查图连通性,而 BFS 适用于寻找最短路径。掌握这些技巧,可以更高效地解决与图相关的复杂问题。
31 2
|
2月前
|
Python
不容错过!Python中图的精妙表示与高效遍历策略,提升你的编程艺术感
本文介绍了Python中图的表示方法及遍历策略。图可通过邻接表或邻接矩阵表示,前者节省空间适合稀疏图,后者便于检查连接但占用更多空间。文章详细展示了邻接表和邻接矩阵的实现,并讲解了深度优先搜索(DFS)和广度优先搜索(BFS)的遍历方法,帮助读者掌握图的基本操作和应用技巧。
41 4
|
2月前
|
算法 Python
Python图论探索:从理论到实践,DFS与BFS遍历技巧让你秒变技术大牛
图论在数据结构与算法中占据重要地位,应用广泛。本文通过Python代码实现深度优先搜索(DFS)和广度优先搜索(BFS),帮助读者掌握图的遍历技巧。DFS沿路径深入搜索,BFS逐层向外扩展,两者各具优势。掌握这些技巧,为解决复杂问题打下坚实基础。
40 2
|
3月前
【LeetCode 31】104.二叉树的最大深度
【LeetCode 31】104.二叉树的最大深度
28 2
|
3月前
【LeetCode 43】236.二叉树的最近公共祖先
【LeetCode 43】236.二叉树的最近公共祖先
24 0
|
3月前
【LeetCode 38】617.合并二叉树
【LeetCode 38】617.合并二叉树
20 0
|
3月前
【LeetCode 37】106.从中序与后序遍历构造二叉树
【LeetCode 37】106.从中序与后序遍历构造二叉树
27 0
|
3月前
【LeetCode 34】257.二叉树的所有路径
【LeetCode 34】257.二叉树的所有路径
24 0
|
3月前
【LeetCode 32】111.二叉树的最小深度
【LeetCode 32】111.二叉树的最小深度
20 0