C++基于递归和非递归算法判定两个二叉树结构是否完全相同(结构和数据都相同)

yizhihongxing

下面是 C++ 基于递归和非递归算法判定两个二叉树结构是否完全相同(结构和数据都相同)的详细攻略:

问题分析

题目要求我们判断两个二叉树的结构和数据是否完全相同。这里所说的“结构相同”指的是两棵树的节点数、节点的左右子树结构相同,而“数据相同”指的是两棵树的节点存储的数据值相等。

递归算法实现

递归是二叉树算法中最经典的算法之一,而判断两个二叉树结构是否相同,也可以通过递归算法实现。递归的思路是:先判断两棵树的根节点是否相等,再递归判断它们的左右子树是否相等。

具体地,我们可以使用以下的递归函数实现:

bool isSameTree(TreeNode* p, TreeNode* q) {
    if (p == nullptr && q == nullptr) {
        // 如果两个节点都是空节点,说明结构和数据都相同
        return true;
    } else if (p == nullptr || q == nullptr) {
        // 如果其中一个节点是空节点,说明结构不同
        return false;
    } else if (p->val != q->val) {
        // 如果两个节点的数据值不相等,说明数据不同
        return false;
    } else {
        // 递归判断左右子树是否相同
        return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
    }
}

在函数中,首先判断两个节点是否都是空节点,如果是,说明结构和数据都相同,返回 true。如果其中一个节点是空节点,另一个不是,说明结构不同,返回 false。然后判断两个节点的数据值是否相等,如果不相等,说明数据不同,返回 false。最后,递归判断两个节点的左右子树是否相同。

非递归算法实现

递归算法虽然简单易懂,但是它有一个缺点,就是如果树的深度过大,递归调用会导致栈溢出。因此,我们还可以使用非递归算法实现题目要求。

具体地,我们可以借助栈的帮助,将两棵二叉树的节点依次放入栈中,然后依次比较它们的数据值。如果数据值不相等,说明两棵树结构和数据不同,返回 false;否则,继续比较它们的左右子树。

以下是非递归算法的实现代码:

bool isSameTree(TreeNode* p, TreeNode* q) {
    stack<TreeNode*> stk;
    stk.push(p);
    stk.push(q);

    while (!stk.empty()) {
        TreeNode* node1 = stk.top(); stk.pop();
        TreeNode* node2 = stk.top(); stk.pop();

        if (node1 == nullptr && node2 == nullptr) {
            // 如果两个节点都是空节点,说明结构和数据都相同
            continue;
        } else if (node1 == nullptr || node2 == nullptr) {
            // 如果其中一个节点是空节点,说明结构不同
            return false;
        } else if (node1->val != node2->val) {
            // 如果两个节点的数据值不相等,说明数据不同
            return false;
        } else {
            // 将左右子节点依次入栈
            stk.push(node1->left);
            stk.push(node2->left);
            stk.push(node1->right);
            stk.push(node2->right);
        }
    }
    return true;
}

与递归算法相比,非递归算法使用了一个栈来存储节点,然后依次比较它们的数据值。如果两个节点的数据值不相等,说明两棵树结构和数据不同,返回 false;否则,将它们的左右子节点依次入栈,继续比较。

示例说明

假设有以下两棵二叉树:

1               1

/ \ / \
2 3 2 3

它们都是如上图所示的二叉树。由于它们的结构和数据都相同,因此,无论是递归算法还是非递归算法,都会返回 true。

再假设有以下两棵二叉树:

1               1

/ \ / \
2 3 2 4

这两棵树的结构相同,但是数据不同。因此,递归算法和非递归算法都会返回 false。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++基于递归和非递归算法判定两个二叉树结构是否完全相同(结构和数据都相同) - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Linux中的文件压缩命令tar与rar的用法总结

    下面是关于Linux中的文件压缩命令tar与rar的用法总结的完整攻略。 简介 在Linux中,文件压缩是一个常见的操作,可以将多个文件或者文件夹打包为一个压缩文件,实现数据的压缩和备份。Linux中有很多文件压缩命令,其中tar是最常用的命令之一,而RAR也是一个压缩命令,比较常用于Windows系统中。本文将介绍tar和rar两个命令的用法,帮助大家更好…

    other 2023年6月28日
    00
  • 讨论在线教室 iOS 端声音问题综合解决方案

    以下是讨论在线教室 iOS 端声音问题综合解决方案的完整攻略: 背景 在线教室是近年来快速发展的教育方式之一,但在使用 iOS 端进行学习过程中,由于硬件或软件等原因,可能会出现声音问题,导致影响学生的学习过程。因此本文旨在探讨如何解决在线教室 iOS 端声音问题。 解决方案 步骤一:排查硬件问题 在使用 iOS 端进行学习时,首先需要检查设备是否存在故障或…

    other 2023年6月26日
    00
  • mysql 8.0.28 winx64.zip安装配置方法图文教程

    MySQL 8.0.28 Winx64.zip安装配置方法图文教程 下载并安装MySQL 1.首先需要下载MySQL 8.0.28版的压缩包,我选择的是Winx64.zip。 2.将下载的压缩包解压到你打算安装MySQL的目录下,我选择的是D:\mysql-8.0.28-winx64。 3.进入解压后的目录,找到bin目录下的mysqld.exe文件,按住S…

    other 2023年6月20日
    00
  • 新手如何正确使用CLion之输出hello world

    下面是关于使用CLion输出hello world的完整攻略,包括环境搭建、代码编写和两个示例说明。 环境搭建 下载安装CLion: 首先,需要从JetBrains官网下载并安装CLion。安装过程中,可以选择安装CMake和编译器。 创建新项目: 打开CLion,选择“Create New Project”,选择“C++ Executable”,然后选择项…

    other 2023年5月6日
    00
  • python的类class定义及其初始化方式

    Python是一门面向对象的编程语言,其中类(class)是面向对象的基础。类是一种抽象的概念,描述了数据和操作数据的方法。在Python中,要定义一个类,需要使用关键字“class”,并遵循一定的命名规范。 定义类(class) 定义一个类的语法如下: class ClassName: attribute1 = value1 attribute2 = va…

    other 2023年6月20日
    00
  • Python基础学习之深浅拷贝问题及递归函数练习

    下面就来详细讲解一下“Python基础学习之深浅拷贝问题及递归函数练习”的完整攻略。 Python 基础学习之深浅拷贝问题及递归函数练习 1. 什么是深浅拷贝 深浅拷贝是 Python 中非常重要的一个概念,它们在使用过程中会经常被涉及到。在 Python 中,我们可以使用 copy 模块中的 copy 函数和 deepcopy 函数来分别实现浅拷贝和深拷贝…

    other 2023年6月27日
    00
  • 将java程序打成jar包在cmd命令行下执行的方法

    下面是将Java程序打成Jar包并在Cmd命令行下执行的详细攻略: 一、打包成Jar包 首先需要确认你的Java文件编写完成,且没有编译错误。 使用Java自带的jar命令打包你的Java应用程序。打开命令行窗口,进入你保存Java文件的文件夹中,使用以下命令: jar cvfm HelloWorld.jar manifest.txt HelloWorld.…

    other 2023年6月26日
    00
  • .netef框架的安装、及三种开发模式

    .NET Framework的安装、及三种开发模式 .NET Framework是一个由Microsoft开发的基础架构,用于创建和运行Windows系统上的应用程序,也是创建.NET应用程序的必需组件。本文将介绍.NET Framework的安装方法,并介绍.NET Framework下的三种不同的开发模式。 .NET Framework的安装 .NET …

    其他 2023年3月29日
    00
合作推广
合作推广
分享本页
返回顶部