/*
相似二叉树判断:非递归实现
相似:两个二叉树都是空的二叉树或只有一个根结点 或者 左右子树都是相似的
通俗说法:两棵树的结构一样,一棵树某个位置有结点另一棵树相对应位置也有
思路:
层次遍历的变体,依次判断两树对应结点是否都空或都不空
如果只是通过先序输入判断是否相似,可以直接比较序列的对应位置
*/
#include <iostream>
#include <cstdlib>
#include <queue>
using namespace std;
typedef char ElemType;
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild, *rchild;
}*BiTree;
//创建二叉树
void CreateTree(BiTree &t){
//递归创建二叉树,输入#代表空树
ElemType e;
cin >> e;
if(e!='#'){
t = (BiTree)malloc(sizeof(BiTNode));
t->data = e;
CreateTree(t->lchild);
CreateTree(t->rchild);
}else{
t = NULL;
}
}
//判断两个二叉树是否相似
bool SimilarTree(BiTree t1, BiTree t2){
if(t1==NULL && t2==NULL){ //两树都为空
return true;
}else if((t1==NULL&&t2!=NULL) || (t1!=NULL&&t2==NULL)){ //一树为空
return false;
}else{ //两树都不为空
queue<BiTree> q1, q2;
q1.push(t1);
q2.push(t2);
while(!q1.empty() || !q2.empty()){ //两个队列有不空的
if(!q1.empty() && !q2.empty()){
BiTree T1 = q1.front();
q1.pop();
BiTree T2 = q2.front();
q2.pop();
if(T1 && T2){
if(T1->lchild&&T2->lchild){ //都不空 入队
q1.push(T1->lchild);
q2.push(T2->lchild);
}else if((T1->lchild&&!T2->lchild) || (!T1->lchild&&T2->lchild)){ //不全有左结点
return false;
}
if(T1->rchild&&T2->rchild){ //都不空 入队
q1.push(T1->rchild);
q2.push(T2->rchild);
}else if((T1->rchild&&!T2->rchild) || (!T1->rchild&&T2->rchild)){ //不全有右结点
return false;
}
}else{ //不全非空
return false;
}
}else{ //队列不全有元素(对应结点不全有)
return false;
}
}
}
return true;
}
int main(){
BiTree t1, t2;
cout << "请输入第一个二叉树:";
CreateTree(t1);
cout << "请输入第二个二叉树:";
CreateTree(t2);
if(SimilarTree(t1, t2)){
cout << "两个二叉树相似" << endl;
}else{
cout << "两个二叉树不相似" << endl;
}
return 0;
}
相似二叉树(非递归)
最新推荐文章于 2021-07-26 15:32:16 发布