• 九度OnlineJudge之1009:二叉搜索树


    题目描述:                       
    判断两序列是否为同一二叉搜索树序列
    输入:                       
    开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
    接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
    接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
    输出:                       

    如果序列相同则输出YES,否则输出NO

    样例输入:                       
    2
    567432
    543267
    576342
    0
    样例输出:                       
    YES
    NO
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    struct Node//二叉树结点结构体
    {
    	Node *lchild;//左儿子指针
    	Node *rchild;//右儿子指针
    	int c;//结点字符信息
    }Tree[110];//静态内存分配数组
    
    int loc;//静态数组中已经分配的结点个数
    
    Node *create()//申请一个结点空间,返回指向其的指针
    {
    	Tree[loc].lchild = Tree[loc].rchild = NULL;//初始化左右儿子为空
    	return &Tree[loc++];//返回指针,loc自增
    }
    
    char  stra[25],strb[25];//stra由原序列经过先序遍历和中序遍历所产生的序列,strb由待比较序列先序和中序遍历产生
    int k=0;//计数
    
    void preOrder(Node *T)//先序遍历
    {
    	stra[k++] = T->c +'0';
    	
    	if (T->lchild!=NULL)
    		preOrder(T->lchild);
    	if (T->rchild!=NULL)
    		preOrder(T->rchild);
    }
    void inOrder(Node *T)//中序遍历
    {
    	if (T->lchild!=NULL)
    		inOrder(T->lchild);
    	stra[k++] = T->c +'0';
    	
    	if (T->rchild!=NULL)
    		inOrder(T->rchild);	
    }
    
    /*
    void postOrder(Node *T)//后序遍历
    {
    	if (T->lchild!=NULL)
    	postOrder(T->lchild);
    	if (T->rchild!=NULL)
    	postOrder(T->rchild);
       cout<<T->c<<" ";
    }*/
    
    Node* insert(Node* root,int value)
    {
    	if (root==NULL)//若当前树为空
    	{
    		root = create();
    		root->c = value;
    		return root;
    	}
    	else
    		if (root->c <value)
    		{
    			root->rchild = insert(root->rchild,value);
    		}
    		else if(root->c > value)
    	{
    		root->lchild = insert(root->lchild,value);
    	}
    
    return root;
    }
    
    int main()
    {
    	int n;
    
    	while(cin>>n,n!=0)
    	{
    		loc = 0;
    		char  str[25];//原序列
    		cin>>str;
    		int len = strlen(str);//长度
           Node *root = NULL;
    	   for (int i=0;i<len;i++)
    		   root = insert(root,str[i]-'0');
    	   k = 0;
    	   memset(stra,0,sizeof(stra));
    	   preOrder(root);
    	   inOrder(root);
    	   strcpy(strb,stra);
    
    	   while(n--)
    	   {
             char str1[11];//待比较序列
    		 cin>>str1;
    		 int  len1 = strlen(str1);
    		 Node * T = NULL;
    		 for (int i=0;i<len1;i++)
    			 T = insert(T,str1[i]-'0');
    		 k = 0;
    		 memset(stra,0,sizeof(stra));
    		 preOrder(T);
    		 inOrder(T);
    		if (strcmp(strb,stra)==0)
                 cout<<"YES"<<endl;
    		 else
    			 cout<<"NO"<<endl;
    	   }
    
    
    	}
    	
      //  system("pause");
    	return 0;
    }

  • 相关阅读:
    【使用教程】CMDer,Window下CMD的替代者
    什么是数据仓库?
    【大话存储】学习笔记(八),数据保护
    分布式与集群
    【大话存储】学习笔记(五),以太网
    【廖雪峰】Python
    【大话存储】学习笔记(7章), OSI模型
    KVM计算虚拟化原理,偏基础
    DevOps
    H3C CAS(云管理平台)介绍
  • 原文地址:https://www.cnblogs.com/ainima/p/6331234.html
Copyright © 2020-2023  润新知