问题 B: 进击的二叉查找树

    xiaoxiao2021-03-25  59

    题目描述

    给定1~N的两个排列,使用这两个排列分别构建两棵二叉查找树(也就是通过往一棵空树中依次插入序列元素的构建方式)。如果这两棵二叉查找树完全相同,那么输出YES;否则输出NO。之后,输出第一个排列对应的二叉查找树的后序序列、层序序列。

    输入

    每个输入文件中一组数据。

    第一行1个正整数N(1<=N<=30),表示二叉查找树中的结点个数。

    接下来两行,代表1~N的两个排列。

    输出

    如果两个排列代表的二叉查找树完全相同,那么输出一行YES,否则输出一行NO。

    接下来两行分别输出第一个排列对应的二叉查找树的后序序列、层序序列,整数之间用空格隔开。

    每行末尾不允许有多余的空格。

    样例输入

    5 4 2 1 3 5 4 5 2 3 1

    样例输出

    YES 1 3 2 5 4 4 2 5 1 3 #include<iostream> #include<queue> #include<stdlib.h>//molloc需要 using namespace std; typedef struct BiTNode{ int value; struct BiTNode *lchild; struct BiTNode *rchild; }BiTNode,*BiTree; //一个指向该类型的指针 //后文中用BiTree定义的都是指针,才可以判断是不是NULL queue<BiTree> Q; int flag; void postOrder(BiTree t){//传入的是指向BiTNode的指针,即BiTree类型 if(t!=NULL){ postOrder(t->lchild); postOrder(t->rchild); if(flag==false){ cout<<t->value; flag = true; } else{ cout<<" "<<t->value; } } } void levelOrder(BiTree t){ while(!Q.empty()) Q.pop(); Q.push(t); while(!Q.empty()){ BiTree tmpt = Q.front(); Q.pop(); if(flag==false){ cout<<tmpt->value; flag = true; } else{ cout<<" "<<tmpt->value; } if(tmpt->lchild) Q.push(tmpt->lchild); if(tmpt->rchild) Q.push(tmpt->rchild); } } int BST_insert(BiTree &T,int x){ if(T==NULL){ T = (BiTree)malloc(sizeof(BiTNode)); T->value = x; T->lchild = T->rchild = NULL; } else if(x == T->value) return 0; else if(x<T->value){ return BST_insert(T->lchild,x); } else return BST_insert(T->rchild,x); } void creat_BST(BiTree &T,int num[],int n){//若要改变树中的结构或值,则要使用引用 T=NULL; int i=0; while(i<n){ BST_insert(T,num[i]); i++; } } int compTree(BiTree T1,BiTree T2){ if(T1 == NULL && T2 == NULL) //两子树都为空,则暂时相等。 return 1; if(T1 != NULL && T2 != NULL){//或者两者都不为空,可以进行下一步比较 if(T1->value == T2->value){//两者值相等,则进一步递归子树的比较情况 if(compTree(T1->lchild,T2->lchild) && compTree(T1->rchild,T2->rchild)){ return 1; } } } //存在一边为空的情况,则返回不一样 return 0; } int main(){ int n; int num1[32]; int num2[32]; BiTree T1 = (BiTree)malloc(sizeof(BiTNode));//由于BiTree类型本身就已经是指针,故无需再加上* BiTree T2 = (BiTree)malloc(sizeof(BiTNode)); while(scanf("%d",&n)!=EOF){ for(int i=0;i<n;i++){ cin>>num1[i]; } for(int i=0;i<n;i++){ cin>>num2[i]; } creat_BST(T1,num1,n); creat_BST(T2,num2,n); if(compTree(T1,T2)){ cout<<"YES"<<endl; } else{ cout<<"NO"<<endl; } flag =false; postOrder(T1); flag =false; cout<<endl; levelOrder(T1); } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-32400.html

    最新回复(0)