在二叉树后序遍历的代码实现中,无论是递归还是非递归方式,处理空节点都是一个重要的细节,以下是分别在两种实现方式中处理空节点的常见方法:
递归实现
在递归实现后序遍历的代码中,当遇到空节点时,直接返回即可,这是因为空节点没有子节点需要遍历,不会对遍历结果产生影响。以下是一个简单的递归实现后序遍历的示例代码,展示了如何处理空节点:
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def postorderTraversal(root):
result = []
def postorder(root):
if root is None:
return
postorder(root.left)
postorder(root.right)
result.append(root.val)
postorder(root)
return result
非递归实现
非递归实现后序遍历通常使用栈来辅助完成遍历过程,对于空节点的处理也相对简单。在遍历过程中,当遇到空节点时,不进行任何入栈操作,直接跳过即可。以下是一个使用一个栈和一个辅助指针实现非递归后序遍历的示例代码,展示了如何处理空节点:
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def postorderTraversal(root):
if root is None:
return []
stack = []
result = []
prev = None
curr = root
while curr or stack:
while curr:
stack.append(curr)
curr = curr.left
curr = stack.pop()
# 如果当前节点的右子树为空或右子树已经被访问过(prev 指向当前节点的右子节点)
if curr.right is None or curr.right == prev:
result.append(curr.val)
prev = curr
curr = None
else:
stack.append(curr)
curr = curr.right
return result
在上述非递归实现中,当当前节点的左子树为空时,会直接跳过左子树的遍历,继续处理栈顶节点。同样,当当前节点的右子树为空或右子树已经被访问过时,会直接访问当前节点,并将其加入结果列表。
无论是递归还是非递归实现后序遍历,正确处理空节点都是保证遍历结果正确的关键之一。通过合理地处理空节点,可以确保遍历算法能够正确地处理各种形态的二叉树,包括包含空节点的二叉树。