数据结构——二叉树入门(二)判断两颗二叉树是否相同
一.判断两颗二叉树是否相同!
分析:
什么叫做两棵树相同?
1.树的结构相同:
节点数目要相同,深度要相同。
2.左子树与右子树相同:
(递归的)每一刻左子树都要与右子树相同。
3.两棵空树也是相同的树。
如图:
OK,现在就到了最开心的源码环节:
//计算一棵二叉树的深度
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树的右子树相同即可。
代码:
//判断两棵树是否互为镜像
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);
}
三.判断一棵树是否是镜像对称树
分析:
就在刚刚我们判断了两颗树是否互为镜像对称。
一棵树的镜像对称:就把一棵树看成两棵就行,即左子树与右子树互为镜像对称就说明该二叉树是一棵镜像对称的二叉树。
空树就是一棵镜像对称树。
如图:
上代码:
//判断一棵树是否是对称树——左子树与右子树镜像对称
bool isSymmetry(TreeNode* root) {
//先进行判空
//空树一定是对称树
if (root == NULL) {
return true;
}
//判断左右子树是否互为镜像
return isMirror(root->left, root->right);
}
四.总结:
有没有发现,空树很特别,啥啥都要去凑个热闹:
①镜像对称。
②两棵空树也是相同的树。
往后还会有很多发现哦。
所以,对二叉树的递归操作时,对它判空是很重要的!!!