二叉树判断(满二叉树, 完全二叉树, 相似, 对称同构)

二:判断二叉树是否为完全二叉树

判断方法: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;
}

三:判断两个二叉树是否相似:

首先给出两棵树相似的递归定义:若已知两棵树二叉树B1B2皆为空,或者皆不空且B1的左右子树和B2的左右子树分别相似,称B1B2相似。请你判别两棵给定的二叉树是否相似。

两个二叉树相似其实就是两个二叉树元素值可能不一样, 但其形状完全一样且节点数完全相同;

//判断两二叉树是否相似 
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;
	 
}

    原文作者:满二叉树
    原文地址: https://blog.csdn.net/controlfate/article/details/6926783
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞