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

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

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

递归实现

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

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

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

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

相关文章
|
存储 小程序 API
【微信小程序】-- uni-app 项目-- 购物车 -- 首页 - 轮播图效果(五十二)
【微信小程序】-- uni-app 项目-- 购物车 -- 首页 - 轮播图效果(五十二)
【微信小程序】-- uni-app 项目-- 购物车 -- 首页 - 轮播图效果(五十二)
|
机器学习/深度学习 数据建模 定位技术
【数据结构】图的基本概念—无/有向图、权和网、完全图、路径与回路
【数据结构】图的基本概念—无/有向图、权和网、完全图、路径与回路
5390 0
【数据结构】图的基本概念—无/有向图、权和网、完全图、路径与回路
|
关系型数据库 PostgreSQL
PostgreSQL 计算字符串字符数函数(CHAR_LENGTH(str))和字符串长度函数(LENGTH(str))
PostgreSQL 计算字符串字符数函数(CHAR_LENGTH(str))和字符串长度函数(LENGTH(str))
3039 0
|
8月前
|
云安全 运维 监控
阿里云安全体检评测报告:一次深入的云上“体检”体验
阿里云安全体检评测报告:一次深入的云上“体检”体验
177 1
阿里云安全体检评测报告:一次深入的云上“体检”体验
|
网络协议 安全 算法
网络空间安全之一个WH的超前沿全栈技术深入学习之路(9-2):WireShark 简介和抓包原理及实战过程一条龙全线分析——就怕你学成黑客啦!
实战:WireShark 抓包及快速定位数据包技巧、使用 WireShark 对常用协议抓包并分析原理 、WireShark 抓包解决服务器被黑上不了网等具体操作详解步骤;精典图示举例说明、注意点及常见报错问题所对应的解决方法IKUN和I原们你这要是学不会我直接退出江湖;好吧!!!
|
安全 Java 开发者
深入解析ReentrantLock重入锁:Java多线程中的利器
深入解析ReentrantLock重入锁:Java多线程中的利器
2668 4
|
传感器 Python
门禁管理系统工程是一个涉及硬件和软件集成的复杂系统,旨在控制人员的出入,并记录和管理相关数据。
门禁管理系统工程是一个涉及硬件和软件集成的复杂系统,旨在控制人员的出入,并记录和管理相关数据。
|
数据安全/隐私保护
(只需五步)注册谷歌账号详细步骤,解决“此电话号码无法验证”问题
注册google一直不方便,因为如果直接去google官网注册,那么它大概率会显示“此电话号码无法用于进行验证”接下来,按着教程来一步步做,就可以实现跳过此限制,成功用手机号注册google了。很简单的。
18773 1
|
SQL 数据处理 数据库
SQL语句优化与查询结果优化:提升数据库性能的实战技巧
在数据库管理和应用中,SQL语句的编写和查询结果的优化是提升数据库性能的关键环节
1128 0
|
消息中间件 Shell Go
GoLang 环境变量与配置
编程语言中的环境变量和配置管理是关键,Go 项目中配置文件不被打包,需通过环境变量解耦代码。
347 0