如何实现二叉树的中序遍历

二叉树的中序遍历(In-order Traversal)是一种深度优先遍历(DFS)的方式,它按照“左子树-根节点-右子树”的顺序访问二叉树的每个节点。这种遍历方式在二叉搜索树(BST)中尤其有用,因为它会按照从小到大的顺序访问所有节点。

实现二叉树的中序遍历有几种常见的方法:递归方法、迭代方法(使用栈)和莫里斯遍历(Morris Traversal,一种不需要额外空间的迭代方法)。

递归方法

递归方法是最直观的实现方式。

 

python复制代码

class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def inorderTraversal(root):
result = []
def inorder(node):
if node:
inorder(node.left) # 遍历左子树
result.append(node.val) # 访问根节点
inorder(node.right) # 遍历右子树
inorder(root)
return result

迭代方法(使用栈)

迭代方法通过显式地使用栈来模拟递归调用栈的行为。

 

python复制代码

def inorderTraversalIterative(root):
stack, result = [], []
current = root
while current or stack:
while current:
stack.append(current)
current = current.left # 尽可能向左遍历
current = stack.pop() # 弹出栈顶元素,即最左的节点
result.append(current.val) # 访问节点
current = current.right # 转向右子树
return result

莫里斯遍历(Morris Traversal)

莫里斯遍历是一种利用叶子节点的空指针域,实现空间复杂度为O(1)的中序遍历方法。

 

python复制代码

def inorderTraversalMorris(root):
result = []
current = root
while current:
if current.left is None:
result.append(current.val)
current = current.right
else:
# 找到前驱节点,即左子树中最右边的节点
predecessor = current.left
while predecessor.right and predecessor.right != current:
predecessor = predecessor.right
# 如果前驱节点的右指针为空,则将其指向当前节点
# 并遍历左子树
if predecessor.right is None:
predecessor.right = current
current = current.left
else:
# 否则,恢复前驱节点的右指针
# 访问当前节点,并遍历右子树
result.append(current.val)
predecessor.right = None
current = current.right
return result

以上是实现二叉树中序遍历的三种主要方法。每种方法都有其特点和适用场景,可以根据具体需求选择合适的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值