3.6二叉搜索树

喜你入骨 提交于 2020-01-13 21:37:29

在这里插入图片描述

#include <stdio.h>
#include <string.h>
using namespace std;
struct node{
 node *lchild;
 node *rchild;
 int c;
}tree[100];
char str1[21],str2[21];//分别存放两比较输入的先序+中序序列
int size1,size2;//存放字符串长 
char *str;//指向正在输入的字符串 
int *size;//计算正在输入字符串长
//str,size与str1 str2,&size1 &size2对应 
int loc;
node *creat(){//生成节点 
 tree[loc].lchild=tree[loc].rchild=NULL;
 return &tree[loc++];//返回指针并处理下一节点 
}
//递归先序遍历 
void preorder(node *tree){
 str[(*size)++]=tree->c-'0';//将扫描到的字符转为数字放入str中 
 if(tree->lchild!=NULL) preorder(tree->lchild);
 if(tree->rchild!=NULL) preorder(tree->rchild);
} 
//递归中序遍历 
void inorder(node *tree){
 if(tree->lchild!=NULL) inorder(tree->lchild);
 str[(*size)++]=tree->c-'0';
 if(tree->rchild!=NULL) inorder(tree->rchild);
} 
//递归插入节点 
node *insert(node *t,int x){
 if(t==NULL){//该节点为空
  t=creat();//生成一个新节点存放x 
  t->c=x;
  return t; 
 }
 else if(t->c<x)//插入的值比节点值大,插到右支树 
  t->rchild=insert(t->rchild,x); 
 else if(t->c>x)
  t->lchild=insert(t->lchild,x);
 return t;
}
int main(){
 int n;
 char tmp[11]; 
 while(scanf("%d",&n)!=EOF&&n!=0){
  loc=0;
  node *t=NULL;
  scanf("%s",tmp);//输入作为比较模板的插入序列 
  for(int i=0;tmp[i]!=0;i++)//按插入序列插入到二叉树中去 
   t=insert(t,tmp[i]-'0');
  str=str1; //此时str1为正在输入的字符串 
  size=&size1;//记录str1串长 
  preorder(t);
  inorder(t);
  str1[size1]=0;//该字符串的末尾加上结束标志 
  //处理要比较的输入序列,共n组
  while(n--!=0){
   loc=0;
   t=NULL;
   scanf("%s",tmp);//输入作为比较模板的插入序列 
   for(int i=0;tmp[i]!=0;i++)//按插入序列插入到二叉树中去 
    t=insert(t,tmp[i]-'0');
   str=str2; //此时str1为正在输入的字符串 
   size=&size2;//记录str1串长 
   preorder(t);
   inorder(t);
   str2[size2]=0;//该字符串的末尾加上结束标志
   puts(strcmp(str1,str2)==0?"Yes":"No");
  }
 }
 return 0;
}

2
567432
543267
576342
0

  • 输入以字符形式转化为数字时,要减去’0’
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!