后序遍历的代码实现中,如何处理空节点?

简介: 无论是递归还是非递归实现后序遍历,正确处理空节点都是保证遍历结果正确的关键之一。通过合理地处理空节点,可以确保遍历算法能够正确地处理各种形态的二叉树,包括包含空节点的二叉树。

在二叉树后序遍历的代码实现中,无论是递归还是非递归方式,处理空节点都是一个重要的细节,以下是分别在两种实现方式中处理空节点的常见方法:

递归实现

在递归实现后序遍历的代码中,当遇到空节点时,直接返回即可,这是因为空节点没有子节点需要遍历,不会对遍历结果产生影响。以下是一个简单的递归实现后序遍历的示例代码,展示了如何处理空节点:

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
AI 代码解读

非递归实现

非递归实现后序遍历通常使用栈来辅助完成遍历过程,对于空节点的处理也相对简单。在遍历过程中,当遇到空节点时,不进行任何入栈操作,直接跳过即可。以下是一个使用一个栈和一个辅助指针实现非递归后序遍历的示例代码,展示了如何处理空节点:

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
AI 代码解读

在上述非递归实现中,当当前节点的左子树为空时,会直接跳过左子树的遍历,继续处理栈顶节点。同样,当当前节点的右子树为空或右子树已经被访问过时,会直接访问当前节点,并将其加入结果列表。

无论是递归还是非递归实现后序遍历,正确处理空节点都是保证遍历结果正确的关键之一。通过合理地处理空节点,可以确保遍历算法能够正确地处理各种形态的二叉树,包括包含空节点的二叉树。

相关文章
每日一题(链表的中间节点)
每日一题(链表的中间节点)
|
5月前
|
让星星⭐月亮告诉你,HashMap中保证红黑树根节点一定是对应链表头节点moveRootToFront()方法源码解读
当红黑树的根节点不是其对应链表的头节点时,通过调整指针的方式将其移动至链表头部。具体步骤包括:从链表中移除根节点,更新根节点及其前后节点的指针,确保根节点成为新的头节点,并保持链表结构的完整性。此过程在Java的`HashMap$TreeNode.moveRootToFront()`方法中实现,确保了高效的数据访问与管理。
45 2
力扣203移除链表元素:思路分析+代码实现+方法总结(伪头节点法&递归)
力扣203移除链表元素:思路分析+代码实现+方法总结(伪头节点法&递归)
159 0
|
10月前
|
331. 验证二叉树的前序序列化
331. 验证二叉树的前序序列化
65 0
|
10月前
链表中涉及“快慢指针”的编程题—“返回中间节点”
链表中涉及“快慢指针”的编程题—“返回中间节点”
76 0
单链表OJ题:LeetCode--142.环形链表Ⅱ(判断第一次入环的节点)
LeetCode--142.环形链表Ⅱ:C语言实现的详细题解过程以及题解的证明思路,提供完整代码。
485 0
前端学习案例6-寻找节点的后继6
前端学习案例6-寻找节点的后继6
75 0
前端学习案例6-寻找节点的后继6
前端学习案例5-寻找节点的后继5
前端学习案例5-寻找节点的后继5
96 0
前端学习案例5-寻找节点的后继5
前端学习案例6-寻找节点的后继6
前端学习案例6-寻找节点的后继6
42 0
前端学习案例6-寻找节点的后继6
前端学习案例2-寻找节点的后继2
前端学习案例2-寻找节点的后继2
74 0
前端学习案例2-寻找节点的后继2