数据结构——二叉树入门(二)判断两颗二叉树是否相同
2019-04-08 21:57
218 查看
一.判断两颗二叉树是否相同!
分析:
什么叫做两棵树相同?
1.树的结构相同:
节点数目要相同,深度要相同。
2.左子树与右子树相同:
(递归的)每一刻左子树都要与右子树相同。
3.两棵空树也是相同的树。
如图:
OK,现在就到了最开心的源码环节:
[code]//计算一棵二叉树的深度 int depthTree(TreeNode* root) { if (root == NULL) { return 0; } int left = depthTree(root->left); int right = depthTree(root->right); return (left > right ? left : right) + 1; } //检查两棵树是否是相同的树 bool isSame(TreeNode* p, TreeNode* q) { //先进行判空 //两棵树均为空,则是相同的树 if (p == NULL && q == NULL) { return true; } //只有一棵树是空树,则必不是相同的树 if (p == NULL || q == NULL) { return false; } //其他情况,左子树相同,右子树相同,结点的值相同 return p->value == q->value&& isSame(p->left, q->left) && isSame(p->right, q->right); }
二.判断两棵树是否互为镜像
分析:
什么叫做互为镜像?
1.结点数不变,深度不变
2.(递归的)左子树变右子树,右子树变左子树。
如图:
所以我们要做的就是递归的判断p树的左子树是否与q树的右子树相同即可。
代码:
[code]//判断两棵树是否互为镜像 bool isMirror(TreeNode* p,TreeNode* q) { //先进行判空 //两棵树均为空树,就是互为镜像 if (p == NULL && q == NULL) { return true; } //只有一棵树是空树,必然不互为镜像 if (p == NULL || q == NULL) { return false; } //一棵树的左子树与另一棵树的右子树相同,则互为镜像 return p->value == q->value&& isMirror(p->left, q->right) && isMirror(p->right, q->left); }
三.判断一棵树是否是镜像对称树
分析:
就在刚刚我们判断了两颗树是否互为镜像对称。
一棵树的镜像对称:就把一棵树看成两棵就行,即左子树与右子树互为镜像对称就说明该二叉树是一棵镜像对称的二叉树。
空树就是一棵镜像对称树。
如图:
上代码:
[code]//判断一棵树是否是对称树——左子树与右子树镜像对称 bool isSymmetry(TreeNode* root) { //先进行判空 //空树一定是对称树 if (root == NULL) { return true; } //判断左右子树是否互为镜像 return isMirror(root->left, root->right); }
四.总结:
有没有发现,空树很特别,啥啥都要去凑个热闹:
①镜像对称。
②两棵空树也是相同的树。
往后还会有很多发现哦。
所以,对二叉树的递归操作时,对它判空是很重要的!!!
相关文章推荐
- 数据结构——判断二叉树是否为完全二叉树
- 判断两棵二叉树是否结构相同
- 【判断两棵二叉排序树是否相同】数据结构实验之查找一:二叉排序树
- C++算法之 求二叉树中叶子节点的个数 与 判断两棵二叉树是否结构相同
- 二叉树(10)----比较两个二叉树是否相同(结构和数据),递归和非递归
- 二叉树问题---判断t1树中是否有与t2树拓扑结构完全相同的子树
- 两个二叉树结构是否相同(结构和数据都相同) -- 递归和非递归方法
- C++基于递归和非递归算法判定两个二叉树结构是否完全相同(结构和数据都相同)
- 判断两颗二叉树是否相同
- 数据结构(C语言实现):判断两棵二叉树是否相等,bug求解
- 数据结构之如何判断一棵二叉树是否是平衡二叉树(AVL树)
- 判断两个二叉树是否结构相同
- 如何判断两颗二叉树是否相同
- 二叉树面试题(一)---判断两个二叉树结构是否相同
- 判断两颗二叉树是否相同
- Junit的使用入门,判断控制台输出是否与预期相同
- 判断两颗棵二叉树是否相等
- 数据结构实验之图论十:判断给定图是否存在合法拓扑序列
- LeetCode基础--二叉树-判断两个树是否相同
- [LeetCode]100. Same Tree--判断二叉树是否相同