比较几颗二叉排序树是否相同

#include <iostream>
using namespace std;
struct Node{    
int num;   
 Node * Left;   
 Node * Right; 
 Node(int n_,Node* p1,Node*p2):num(n_),Left(p1),Right(p2){}
Node(){}
};//结果体内置node的构造函数Node* 
insert_(int t,Node* root){    if(root==NULL) 
{        
root = new Node(t,NULL,NULL);//这里直接把当前节点的左右指针赋值为null,下一次传入左或右指针时就会分配空间。    
}    
else if(t > (root->num)) 
{//往右       
 root->Right = insert_(t,root->Right);   /*1    root     node1(root为null)      root-right为null2    root      判断(假设>)       root-right     node2(root-right为null)      root-right-right为null3   root    判断(>)     root-right    判断(>)      root-right-right    node3  (root-right-right为null)     root-right-right-right 为null*/    
 }    
 else if(t < (root->num)) 
 {//往左       
  root->Left = insert_(t,root->Left);    }    
  return root;
  }
  Node * build(int n)
  {    
  Node* root=NULL;    
  while(n--) {        
  int t; cin>>t;        
  root = insert_(t,root);    
  }    
  return root;
  }
  //传入节点总数n,build(n)进行二次排序树的构建,输入n个t,每个t都会存入一个新分配的节点空间中bool isSame(Node *t1, Node *t2) 
  {			
  //用递归去判断是否为同一颗树,对传入的两个结点进行判断	
  if (t1 == NULL && t2 == NULL)		return true;	
  else if (t1->num == t2->num) 		return isSame(t1->Left, t2->Left) && isSame(t1->Right, t2->Right);	
  else		return false;
  }
  void FreeTree(Node* root){//直到root-......-left/right=null时,delete这个节点。    
  if(root->Left) 
  FreeTree(root->Left);    
  if(root->Right) 
  FreeTree(root->Right);    
  delete root;
  }
  int main(){    
  int N,L;    
  while(1)    
  {        
  cin>>N>>L;		
  if(!N)    
  return 0;        
  Node* root=build(N);   //创建对照树         
  for (int i = 0; i < L; i++) 
  {		
  //输入需要比较的节点,每次测试完都重置			
  Node* test=build(N);			
  if (isSame(root, test))				  
   << "Yes" << endl;			
  else				
  cout << "No" << endl;			FreeTree(test);  //释放整个test测试树		 }        
  FreeTree(root);  //释放对照树  
  return 0;
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值