码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 3791 二叉搜索树

时间:2015-05-04 15:38:49      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;

typedef struct Node
{
     Node *l,*r;
	 int num;
}*tree;

char f1[11],f2[11],l1[11],l2[11];
int cnt;

void insert(tree *T,int num)    //创建二叉树
{
    if ((*T) != NULL)
    {
        if (num < (*T)->num)
        {
			insert(&(*T)->l,num);
        }
		else
			insert(&(*T)->r,num);
    }
	else
	{
        *T = (tree)malloc(sizeof(Node));
		(*T)->num = num;
		(*T)->l = NULL;
		(*T)->r = NULL;
	}
}
// 
// void insert(tree T,int num)    //创建二叉树
// {
//     if ((T) != NULL)
//     {
//         if (num < (T)->num)
//         {
// 			insert(T->l,num);
//         }
// 		else
// 			insert(T->r,num);
//     }
// 	else
// 	{
//         T = (tree)malloc(sizeof(Node));
// 		T->num = num;
// 		T->l = NULL;
// 		T->r = NULL;
// 	}
// }

void pre_order(tree T,char f[])    //先序遍历,将遍历后的数据存在f数组中
{
    if (T)
    {
		f[cnt++] = T->num + '0';
		pre_order(T->l,f);
		pre_order(T->r,f);
    }
}

void post_order(tree T,char f[])    //后序遍历
{
	if (T)
    {
		pre_order(T->l,f);
		pre_order(T->r,f);
		f[cnt++] = T->num + '0';
    }
}


int main()
{
    int n,i,k;
	string str;
	tree T=NULL;
	tree T1=NULL;
	while (cin>>n,n)
	{
       cin>>str;

       for (i=0;i<str.length();i++)
       {
		   insert(&T,str[i]-'0');
       }
	   cnt = 0;
	   pre_order(T,f1);
	   f1[cnt] = 0;           //易错点
	   cnt = 0;
	   post_order(T,l1);
	   l1[cnt] = 0;

	   for (i=0;i<n;i++)
	   {
		   cin>>str;
		   memset(f2,0,sizeof(f2));
		   memset(l2,0,sizeof(l2));
		   for (k=0;k<str.length();k++)
		   {
			   insert(&T1,str[k]-'0');
		   }
		   cnt = 0;
		   pre_order(T1,f2);
		   f2[cnt] = 0;
		   cnt = 0;
	       post_order(T1,l2);
           l2[cnt] = 0;
		   if (strcmp(f1,f2) != 0 || strcmp(l1,l2) != 0)
		   {
			   cout<<"NO"<<endl;
		   }
		   else
			   cout<<"YES"<<endl;
		   free(T1);
		   T1=NULL;
	   }
	   free(T);
	   T=NULL;
	}
	return 0;
}

先创建树,再根据先序遍历与后序遍历是否都相等,相等则为同一树,反之,不同

insert函数的参数要注意引用,,,有关引用不是很懂。求大神给本菜鸟讲讲


第二种方法是用:数组创建树。

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;

char tree1[1100],tree2[3000],tree3[3000];

void buildtree(char *temtree,int pos,char data)
{
     if (temtree[pos] == '.')
     {
		 temtree[pos] = data;
		 return ;
     }
	 if (temtree[pos] < data)
	 {
		 buildtree(temtree,pos*2+1,data);
	 }
	 else
		 if (temtree[pos] > data)
		 {
			 buildtree(temtree,pos*2,data);
		 }
}

int main()
{
    int n,i,k;
	while (cin>>n,n)
	{
       memset(tree2,'.',sizeof(tree2));
	   cin>>tree1;
	   for (i=0;i<strlen(tree1);i++)
	   {
             buildtree(tree2,1,tree1[i]);
	   }
	   for (i=0;i<n;i++)
	   {
		   cin>>tree1;
		   memset(tree3,'.',sizeof(tree3));   //易错点
		   for (k=0;k<strlen(tree1);k++)
		   {
			   buildtree(tree3,1,tree1[k]);
		   }
		   if (strcmp(tree2,tree3))
		   {
			   cout<<"NO"<<endl;
		   }
		   else
			   cout<<"YES"<<endl;
	   }
	}
	return 0;
}



HDU 3791 二叉搜索树

标签:

原文地址:http://blog.csdn.net/xinwen1995/article/details/45479485

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!