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)的主要内容,如果未能解决你的问题,请参考以下文章