LeetCode:94. 二叉树的中序遍历(python3)

Posted 南岸青栀*

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode:94. 二叉树的中序遍历(python3)相关的知识,希望对你有一定的参考价值。

94. 二叉树的中序遍历

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

左中右

法1:经典解法

写一个递归函数,先查找左节点,然后依次输出元素,再查找右节点

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        lst = []
        def inOrder(root):

            if root == None:
                return 
            inOrder(root.left)
            lst.append(root.val)
            inOrder(root.right)
        inOrder(root)
        return lst

法2:标记法

规则:
未访问的节点标记为0,访问过的节点标记为1.
栈思想
例子:
在这里插入图片描述

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        lst = []

        stack = [(0,root)]

        while stack:
            print(stack)
            flag,node = stack.pop()
            if node == None: continue
            if flag == 0:
                stack.append((0,node.right))
                stack.append((1,node))
                stack.append((0,node.left))
            else:
                lst.append(node.val)
        return lst

在这里插入图片描述

法3:优化法2(够python)

由上图可知,正常节点类型为TreeNode
val值为int
通过判断当前数据类型,来确定是否走过节点

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        #法2优化
        stack,rst = [root],[]
        while stack:
            i = stack.pop()
            if isinstance(i,TreeNode):
                stack.extend([i.right,i.val,i.left])
            elif isinstance(i,int):
                rst.append(i)
        return rst

法4:莫里斯遍历

用递归和迭代的方式都使用了辅助的空间,而莫里斯遍历的优点是没有使用任何辅助空间。
缺点是改变了整个树的结构,强行把一棵二叉树改成一段链表结构。
在这里插入图片描述

我们将黄色区域部分挂到节点5的右子树上,接着再把2和5这两个节点挂到4节点的右边。
这样整棵树基本上就变改成了一个链表了,之后再不断往右遍历。
在这里插入图片描述

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        #
        res = []
        pre = None
        while root:
			# 如果左节点不为空,就将当前节点连带右子树全部挂到
			# 左节点的最右子树下面
            if root.left:
                pre = root.left
                while pre.right:
                    pre = pre.right
                pre.right = root
				# 将root指向root的left
                tmp = root
                root = root.left
                tmp.left = None
			# 左子树为空,则打印这个节点,并向右边遍历	
            else:
                res.append(root.val)
                root = root.right
        return res

以上是关于LeetCode:94. 二叉树的中序遍历(python3)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 94. 二叉树的中序遍历

LeetCode Java刷题笔记—94. 二叉树的中序遍历

255.LeetCode | 94. 二叉树的中序遍历

Leetcode 94. 二叉树的中序遍历

Leetcode 94. 二叉树的中序遍历

LeetCode 94. 二叉树的中序遍历