我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++实现判断相同树的功能

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++实现判断相同树的功能

本篇内容主要讲解“C++实现判断相同树的功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++实现判断相同树的功能”吧!

判断相同树

Given two binary trees, write a function to check if they are the same or not.

Two binary trees are considered the same if they are structurally identical and the nodes have the same value.

Example 1:

Input:     1         1
    / \       / \
2   3     2   3

        [1,2,3],   [1,2,3]

Output: true

Example 2:

Input:     1         1
/           \
2             2

[1,2],     [1,null,2]

Output: false

Example 3:

Input:     1         1
/ \       / \
2   1     1   2

[1,2,1],   [1,1,2]

Output: false

判断两棵树是否相同和之前的判断两棵树是否对称都是一样的原理,利用深度优先搜索 DFS 来递归。代码如下:

解法一:

class Solution {public:    bool isSameTree(TreeNode *p, TreeNode *q) {        if (!p && !q) return true;        if ((p && !q) || (!p && q) || (p->val != q->val)) return false;        return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);    }};

这道题还有非递归的解法,因为二叉树的四种遍历(层序,先序,中序,后序)均有各自的迭代和递归的写法,这里我们先来看先序的迭代写法,相当于同时遍历两个数,然后每个节点都进行比较,可参见之间那道 Binary Tree Preorder Traversal,参见代码如下:

解法二:

class Solution {public:    bool isSameTree(TreeNode* p, TreeNode* q) {        stack<TreeNode*> st;        st.push(p); st.push(q);        while (!st.empty()) {            p = st.top(); st.pop();            q = st.top(); st.pop();            if (!p && !q) continue;            if ((p && !q) || (!p && q) || (p->val != q->val)) return false;            st.push(p->right); st.push(q->right);            st.push(p->left); st.push(q->left);        }        return true;    }};

也可以使用中序遍历的迭代写法,对应之前那道 Binary Tree Inorder Traversal,参见代码如下:

解法三:

class Solution {public:    bool isSameTree(TreeNode* p, TreeNode* q) {        stack<TreeNode*> st;        while (p || q || !st.empty()) {            while (p || q) {                if ((p && !q) || (!p && q) || (p->val != q->val)) return false;                st.push(p); st.push(q);                p = p->left; q = q->left;            }            p = st.top(); st.pop();            q = st.top(); st.pop();            p = p->right; q = q->right;        }        return true;    }};

对于后序遍历的迭代写法,貌似无法只是用一个栈来做,因为每次取出栈顶元素后不立马移除,这样使用一个栈的话两棵树结点的位置关系就会错乱,分别使用各自的栈就好了,对应之前那道 Binary Tree Postorder Traversal,参见代码如下:

解法四:

class Solution {public:    bool isSameTree(TreeNode* p, TreeNode* q) {        stack<TreeNode*> st1, st2;        TreeNode *head1, *head2;        while (p || q || !st1.empty() || !st2.empty()) {            while (p || q) {                if ((p && !q) || (!p && q) || (p->val != q->val)) return false;                st1.push(p); st2.push(q);                p = p->left; q = q->left;            }            p = st1.top();             q = st2.top();             if ((!p->right || p->right == head1) && (!q->right || q->right == head2)) {                st1.pop(); st2.pop();                head1 = p; head2 = q;                p = nullptr; q = nullptr;            } else {                p = p->right;                q = q->right;            }        }        return true;    }};

对于层序遍历的迭代写法,其实跟先序遍历的迭代写法非常的类似,只不过把栈换成了队列,对应之前那道 Binary Tree Level Order Traversal,参见代码如下:

解法五:

class Solution {public:    bool isSameTree(TreeNode* p, TreeNode* q) {        queue<TreeNode*> que;        que.push(p); que.push(q);        while (!que.empty()) {            p = que.front(); que.pop();            q = que.front(); que.pop();            if (!p && !q) continue;            if ((p && !q) || (!p && q) || (p->val != q->val)) return false;            que.push(p->right); que.push(q->right);            que.push(p->left); que.push(q->left);        }        return true;    }};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/100 

类似题目:

Binary Tree Preorder Traversal

Binary Tree Inorder Traversal

Binary Tree Postorder Traversal

Binary Tree Level Order Traversal

参考资料:

https://leetcode.com/problems/same-tree/

https://leetcode.com/problems/same-tree/discuss/32684/My-non-recursive-method

https://leetcode.com/problems/same-tree/discuss/32687/Five-line-Java-solution-with-recursion

到此,相信大家对“C++实现判断相同树的功能”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++实现判断相同树的功能

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++实现判断相同树的功能

本篇内容主要讲解“C++实现判断相同树的功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++实现判断相同树的功能”吧!判断相同树Given two binary trees, write a
2023-06-20

Python3判断节假日功能怎么实现

实现Python3判断节假日的功能,可以使用第三方库进行实现,例如`holidays`库。首先,需要安装`holidays`库:```pythonpip install holidays```然后,可以使用如下代码来判断一个日期是否是节假日
2023-08-17

C#中怎么实现断点续传功能

本篇文章为大家展示了C#中怎么实现断点续传功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。以下是一个请求报文与相应的回复报文的例子:GET /image/index_r4_c1.jpg HTTP/
2023-06-17

用c语言编程实现素数判断(判断素数的c语言程序函数)

以下是一个用C语言编写的判断素数的函数:```c#include #include bool isPrime(int n) {if (n return false;}for (int i = 2; i * i if (n % i == 0)
2023-09-22

Redis实现排行榜及相同积分按时间排序功能的实现

目录不考虑积分相同积分相同按时间排序,排名唯一设计1设计2积分相同按时间排序,并列排名在日常的开发中,经常会碰到需要对用户的分值等进行排序,比如在游戏里面需要对战斗力进行排行,在组队活动中需要对各个队伍的贡献值进行排行,在微信中需要对各个好
2022-08-22

mysql实现if语句判断功能的6种使用形式小结

目录前言一、ifnull函数二、nullif函数三、if函数四、if语句(多用于存储过程)五、if-else语句(多用于存储过程)六、if-elseif-else语句(多用于存储过程)总结前言在mysql数据库中实现判断功能有很多方式,具
2023-08-07

C语言怎么实现合式公式的判断

这篇文章主要讲解了“C语言怎么实现合式公式的判断”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言怎么实现合式公式的判断”吧!合式公式很明显用递归去模拟实现判断过程相对容易。(当然利用栈,
2023-06-29

帝国ecms列表页标题图片判断功能实现方法

首先看一下效果俺真的是菜鸟级别的,能弄出这个效果来,着实高兴了一会儿, 按照习惯, 分享一下。小改了一个文件,就是e\class\connect.php中标题图片的部分,797行 ,在标签模板中调用时用!--titlepic--]即可得到<
2022-06-12

Android实现从相册截图的功能

在这篇文章中,我将向大家展示如何从相册截图。 先看看效果图:上一篇文章中,我就拍照截图这一需求进行了详细的分析,试图让大家了解Android本身的限制,以及我们应当采取的实现方案。大家可以回顾一下:Android实现拍照截图功能 根据我们的
2022-06-06

php如何实现判断字符串输出不同的值

这篇文章主要讲解了“php如何实现判断字符串输出不同的值”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php如何实现判断字符串输出不同的值”吧!首先,我们需要了解PHP中判断字符串的基本方法
2023-07-05

不同类型的 C++ GUI 库如何利用函数实现不同的功能?

是的,c++++ 具有多种 gui 库,提供函数实现不同 gui 功能。qt 提供:qpushbutton(按钮)、qvboxlayout(垂直布局)、qtabwidget(选项卡窗口)、qgraphicsview(自定义图形场景渲染)。w
不同类型的 C++ GUI 库如何利用函数实现不同的功能?
2024-04-25

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录