二:判断二叉树是否为完全二叉树
判断方法:1:以层次遍历的方法, 找到第一个两个儿子不都存在的节点
2:(1)若此节若左儿子不存在,右儿子存在,则此二叉树不是完全二叉树
(2 ) 若此节点有左儿子,无右儿子,或则两个儿子都不存在,则只需判断此节点后面的节点是否
有儿子:若无儿子,则是完全二叉树; 否则,则不是完全二叉树;
函数:
typedef struct Node
{
char data;
Node *left;
Node *right;
}BTNode;
int Judge(BTNode *root)
{
Node *p;
queue<BTNode *> Q;
if( root!=NULL )
{
Q.push( root );
//通过层次遍历,找到第一个两儿子不都存在的节点
while( !Q.empty() )
{
p=Q.front();
Q.pop();
if( p->left!=NULL && p->right!=NULL)
{
Q.push( p->left );
Q.push( p->right );
}
else break;
}
//判断一:若左儿子不存在,右儿子存在,则不是完全二叉树
if( p->left==NULL && p->right!=NULL )
return 0;
//其他
else
{
//如果左儿子不为空, 则入队列
if( p->left!=NULL )
Q.push(p->left);
//若队列中剩余的节点存在儿子, 则不是完全二叉树
while( !Q.empty())
{
p=Q.front();
Q.pop();
if( p->left!=NULL || p->right!=NULL)
return 0;
}
}
}
return 1;
}
三:判断两个二叉树是否相似:
首先给出两棵树相似的递归定义:若已知两棵树二叉树B1和B2皆为空,或者皆不空且B1的左右子树和B2的左右子树分别相似,称B1和B2相似。请你判别两棵给定的二叉树是否相似。
两个二叉树相似其实就是两个二叉树元素值可能不一样, 但其形状完全一样且节点数完全相同;
//判断两二叉树是否相似
int Like(BTNode *p1, BTNode *p2)
{
if(p1==NULL && p2==NULL)
return 1;
else if( p1==NULL || p2==NULL)
return 0;
else return Like(p1->left, p2->left)&Like(p1->right, p2->right);
}
四:判断二叉树是否对称同构
实际就是递归的判断左右子树是否相似, 因此在判断相似的基础上加一个特判就OK了……
//判断一棵树是否对称同构
int Symmtree(BTNode *root)
{
if( root==NULL)//当树为空时
return 1;
else
return Like(root->left, root->right)
}
完整代码:
#include<iostream>
#include<queue>
#include<stack>
using namespace std;
typedef struct Node
{
char data;
Node *left;
Node *right;
}BTNode;
//由括号表示法创建二叉树
void CreateBTree(BTNode *&root, char str[])
{
int i=0, flag;
BTNode *p=NULL, *temp=NULL;
stack<Node *> S;
while( str[i]!='\0')
{
switch( str[i] )
{
case '(':flag=1; S.push(p); break;//表示其后创建的为左儿子
case ')':S.pop( );break;//栈顶元素的左右儿子处理完了, 出栈
case ',':flag=2;break;//其后创建的为右儿子
default:
p=new Node;
p->data=str[i]; p->left=p->right=NULL;
if( root==NULL )
root=p;
else
{
temp=S.top();
switch( flag )
{
case 1:temp->left=p; break;
case 2:temp->right=p; break;
}
}
}
i++;
}
}
//判断是否为完全二叉树
int CmpBTree(BTNode *root)
{
Node *p;
queue<BTNode *> Q;
if( root!=NULL )
{
Q.push( root );
//通过层次遍历,找到第一个两儿子不都存在的节点
while( !Q.empty() )
{
p=Q.front();
Q.pop();
if( p->left!=NULL && p->right!=NULL)
{
Q.push( p->left );
Q.push( p->right );
}
else break;
}
//判断一:若左儿子不存在,右儿子存在,则不是完全二叉树
if( p->left==NULL && p->right!=NULL )
return 0;
//其他
else
{
//如果左儿子不为空, 则入队列
if( p->left!=NULL )
Q.push(p->left);
//若队列中剩余的节点存在儿子, 则不是完全二叉树
while( !Q.empty())
{
p=Q.front();
Q.pop();
if( p->left!=NULL || p->right!=NULL)
return 0;
}
}
}
return 1;
}
//判断两二叉树是否相似
int Like(BTNode *p1, BTNode *p2)
{
if(p1==NULL && p2==NULL)
return 1;
else if( p1==NULL || p2==NULL)
return 0;
else return Like(p1->left, p2->left)&Like(p1->right, p2->right);
}
//判断一棵树是否对称同构
int SymmTree(BTNode *root)
{
if( root==NULL)//当树为空时
return 1;
else
return Like(root->left, root->right);
}
int main()
{
int n;
char str1[1000], str2[1000];
BTNode *root1=NULL, *root2=NULL;
//判断是否为完全二叉树
cin>>str1;
root1=NULL;
CreateBTree(root1, str1);
if( CmpBTree(root1) )
cout<<"Yes."<<endl;
else
cout<<"No."<<endl;
//判断两个二叉树是否相似
cin>>str1>>str2;
root1=root2=NULL;
CreateBTree(root1, str1);
CreateBTree(root2, str2);
if( Like(root1, root2))
cout<<"Yes."<<endl;
else
cout<<"No."<<endl;
//判断一棵二叉树是否为相似同构
cin>>str1;
root1=NULL;
CreateBTree(root1, str1);
if( SymmTree(root1) )
cout<<"Yes."<<endl;
else
cout<<"No."<<endl;
}