#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;
}
比较几颗二叉排序树是否相同
最新推荐文章于 2021-12-28 10:48:49 发布