二叉树问题 求解

bljswpu 2013-01-01 03:54:59
为啥我输入后就吗没反应了
#include<stdio.h>
#include<malloc.h>
typedef struct Binnode //二叉树结点结构体
{
char data;
struct Binnode *lchild;
struct Binnode *rchild;
}Binnode;
typedef Binnode *Bintree;
/* 按照前序遍历建立二叉树 */
void Creat_Bintree(Bintree *root)
{

char ch;
while((ch = getchar())!= EOF)
if (ch==' ')
{
*root=NULL;
}
else
{
*root=(Binnode*)malloc(sizeof(Binnode));
(*root)->data=ch;
Creat_Bintree(&(*root)->lchild);
Creat_Bintree(&(*root)->rchild);
}
}
/* 按照前序递归遍历二叉树 */
void Preorder1(Bintree t)
{
if (t!=NULL)
{
printf("%c",t->data);
Preorder1(t->lchild);
Preorder1(t->rchild);
}
}
int mian(){
Bintree T;
creat(&T);
Preorder(T);
return 0;
}
...全文
200 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
abc41106 2013-01-03
  • 打赏
  • 举报
回复
光有前序是不能构成唯一的树的。
对这个程序而言,你输入12453的方式决定它构成的是什么样的树。
“输入124,然后回车2次,输入5,回车2次,输入3,回车2次。”
按这个方式构成的树,前序是12453,后序是45231,中序是42513。
如图:

实际上你创建的树是这样的,因为回车表示空,所以3、4、5是叶子节点
有区别的原因主要是回车的位置和次数,因为回车就表示此节点的左孩子或右孩子为空。
所以我建议你先把你想要建立的树画出来,然后按前序遍历走
引用 11 楼 bljswpu 的回复:
引用 10 楼 abc41106 的回复:
输入124,然后回车2次,输入5,回车2次,输入3,回车2次。
回车就代表这个节点为空,才能从递归返回。
像你这种做法,只知道前序,不这样做的话,它就会一直往下递归,永远回不来。
最好的方法是提供前序、中序,然后再去生成树。就方便多了


C/C++ code
?



123456789101112131415161718192……
bljswpu 2013-01-03
  • 打赏
  • 举报
回复
引用 10 楼 abc41106 的回复:
输入124,然后回车2次,输入5,回车2次,输入3,回车2次。 回车就代表这个节点为空,才能从递归返回。 像你这种做法,只知道前序,不这样做的话,它就会一直往下递归,永远回不来。 最好的方法是提供前序、中序,然后再去生成树。就方便多了
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
	char data;
	struct Node *lchild;
	struct Node *rchild;
}Binnode;
typedef Binnode *Treenode;
//按前序遍历创建二叉树
void creat(Treenode *root) {
	char ch = getchar();
	if (ch == '\n') {
		*root = NULL;
	}
	else {
		*root = (Binnode *)malloc(sizeof(Binnode));
		(*root)->data = ch;
		creat(&(*root)->lchild);
		creat(&(*root)->rchild);
	}
}
//前序遍历二叉树
void preorder(Treenode T) {
	if(T) {	
		printf("%c\t", T->data);
		preorder(T->lchild);
		preorder(T->rchild);
	}	
	
}
//后序遍历二叉树
void posorder(Treenode T) {
	if (T){	
		preorder(T->lchild);
		preorder(T->rchild);
		printf("%c\t", T->data);
	}	
	
}
//中序遍历二叉树
void inorder(Treenode T) {
	if(T) {	
		preorder(T->lchild);
		printf("%c\t", T->data);
		preorder(T->rchild);
	}	
	
}
//交换左子树和右子树
void exchange(Treenode T) {
	Treenode temp;
	if(!T) {
		return ;
	}
	exchange(T->lchild);
	exchange(T->rchild);
	temp = T->lchild;
	T->lchild = T->rchild;
	T->rchild = temp;
}
//叶子节点
int leaves(Treenode T) {
	if(T) {
		if(T->lchild == NULL && T->rchild == NULL) {
			return 1;
		}
		return leaves(T->lchild) + leaves (T->rchild);
	}
	return 0;
}
//深度
int depth(Treenode T) {
	int lh, rh;
	if (!T) {
		return 0;
	}
	else {
		lh = depth(T->lchild);
		rh = depth(T->rchild);
		return (lh>rh?lh:rh) + 1;
	}
}
//节点数
int num(Treenode T) {
	if(!T) {
		return 0;
	}
	return num(T->lchild) + num(T->rchild) + 1;
}
int main() {
	Treenode T;
	printf("preceeder create a tree******\n");
	creat(&T);
	printf("\n");
	printf("preceeder search a tree******\n");
	preorder(T);
	printf("\n");
	printf("middle search a tree*********\n");
	inorder(T);
	printf("\n");
	printf("post search a tree***********\n");
	posorder(T);
	printf("the number of leave is %d\n", leaves(T));
	printf("the number of node is %d\n", num(T));
	return 0;
}
请问一下 我前序遍历生成数的顺序是12453,但我中序遍历和后序遍历得到的结果是24513和24531.我觉得中序遍历和后序遍历是42513和45231才对呀
abc41106 2013-01-03
  • 打赏
  • 举报
回复
思想就是遍历前序序列,看它在中序序列中的位置。 代码网上有的,你找一个看看,应该能懂。
引用 14 楼 bljswpu 的回复:
引用 12 楼 abc41106 的回复: 光有前序是不能构成唯一的树的。 对这个程序而言,你输入12453的方式决定它构成的是什么样的树。 “输入124,然后回车2次,输入5,回车2次,输入3,回车2次。” 按这个方式构成的树,前序是12453,后序是45231,中序是42513。 如图: 实际上你创建的树是这样的,因为回车表示空,所以3、4、5是叶子节点 有区别的原因主要是回……
bljswpu 2013-01-03
  • 打赏
  • 举报
回复
引用 12 楼 abc41106 的回复:
光有前序是不能构成唯一的树的。 对这个程序而言,你输入12453的方式决定它构成的是什么样的树。 “输入124,然后回车2次,输入5,回车2次,输入3,回车2次。” 按这个方式构成的树,前序是12453,后序是45231,中序是42513。 如图: 实际上你创建的树是这样的,因为回车表示空,所以3、4、5是叶子节点 有区别的原因主要是回车的位置和次数,因为回车就表示此节点的左孩子或……
谢谢了 ,我中序和后序的代码写成前序了 。所以当递归到第二层以上的时候,就变成了前序遍历了。我想问下怎么用前序和中序去生成一棵树呢
疯狂的红豆 2013-01-03
  • 打赏
  • 举报
回复
void Creat_Bintree(Bintree *root) { char ch; while((ch = getchar())!= EOF) if (ch==' ') { *root=NULL; } else { *root=(Binnode*)malloc(sizeof(Binnode)); (*root)->data=ch; Creat_Bintree(&(*root)->lchild); Creat_Bintree(&(*root)->rchild); } } 问题应该再你的函数参数处,我之前写二叉树的时候也是犯了这么一个错误,你的指针参数应该改为指针的引用,因为指针作为参数传递的时候就是个值传递,你的二叉树上下层之间是不会建立正确的联系的。只有用void Creat_Bintree(Bintree *&root),这样子你的上下层之间才能建立正确的联系,具体请看我的一篇博文: http://blog.csdn.net/zlhy_/article/details/8219652
bljswpu 2013-01-02
  • 打赏
  • 举报
回复
引用 8 楼 abc41106 的回复:
引用 4 楼 bljswpu 的回复: C/C++ code ? 12345678910111213141516171819202122232425262728293031323334353637 #include<stdio.h> #include<malloc.h> typedef struct Binnode //二叉树结点结构体 { char dat……
你的输入格式是咋样的 ,我这儿输入就没反应了
abc41106 2013-01-02
  • 打赏
  • 举报
回复
输入124,然后回车2次,输入5,回车2次,输入3,回车2次。 回车就代表这个节点为空,才能从递归返回。 像你这种做法,只知道前序,不这样做的话,它就会一直往下递归,永远回不来。 最好的方法是提供前序、中序,然后再去生成树。就方便多了
abc41106 2013-01-01
  • 打赏
  • 举报
回复
引用 4 楼 bljswpu 的回复:
C/C++ code ? 12345678910111213141516171819202122232425262728293031323334353637 #include<stdio.h> #include<malloc.h> typedef struct Binnode //二叉树结点结构体 { char data; struct Binnod……
1.main写成mian了 2.Creat_Bintree(&T);首字母C是大写的。 主要问题: Creat_Bintree递归没写好
#include<stdio.h>
 #include<malloc.h> 
typedef struct Binnode //二叉树结点结构体 
{   
  char data;   
  struct Binnode *lchild; 
    struct Binnode *rchild; 
}Binnode; 
typedef Binnode *Bintree;
 /*  按照前序遍历建立二叉树 */
void Creat_Bintree(Bintree *root) {   
   char ch = getchar();//此次只需要读取一个字符,不能用循环。因为下面递归调用还会走这里
   if (ch=='\n') {//我用\n作为节点为空的标志
       *root=NULL;   
   }    
 else    {     
    *root=(Binnode*)malloc(sizeof(Binnode));   
      (*root)->data=ch;  
      Creat_Bintree(&(*root)->lchild);   
      Creat_Bintree(&(*root)->rchild);   
  } 
} 
/* 按照前序递归遍历二叉树 */
void Preorder1(Bintree t) {   
  if (t!=NULL)  
   {         
  printf("%c",t->data);       
  Preorder1(t->lchild);   
  Preorder1(t->rchild); 
 }
 } 
int main(){   
  Bintree T;  
   Creat_Bintree(&T); 
    Preorder1(T);   
  return 0; } 
构造一完全二叉树,其层次遍历是12345
124

5

3

12453Press any key to continue
Null丶晓风 2013-01-01
  • 打赏
  • 举报
回复
#include<stdio.h>
 #include<malloc.h> 
typedef struct Binnode //二叉树结点结构体 
{   
  char data;   
  struct Binnode *lchild; 
    struct Binnode *rchild; 
}Binnode; 
typedef Binnode *Bintree;//这里好像也有问题
 /*  按照前序遍历建立二叉树 */
void Creat_Bintree(Bintree *root) {  //这里应该是 **root
    char ch;    
 while((ch = getchar())!= EOF)  
   if (ch==' ')     {  
       *root=NULL;     
}    
 else    {     
    *root=(Binnode*)malloc(sizeof(Binnode));   
      (*root)->data=ch;  
       Creat_Bintree(&(*root)->lchild);   
      Creat_Bintree(&(*root)->rchild);   
  } 
} 
/* 按照前序递归遍历二叉树 */
void Preorder1(Bintree t) {   
  if (t!=NULL)  
   {         
printf("%c",t->data);       
  Preorder1(t->lchild);   
      Preorder1(t->rchild); 
    }
 } 
int mian(){//这里应该是main   
  Bintree T;  
   creat_Bintree(&T); 
    Preorder1(T);   
  return 0; } 
我也不怎么懂二叉树。你自己看吧
abc41106 2013-01-01
  • 打赏
  • 举报
回复
引用 4 楼 bljswpu 的回复:
C/C++ code ? 12345678910111213141516171819202122232425262728293031323334353637 #include<stdio.h> #include<malloc.h> typedef struct Binnode //二叉树结点结构体 { char data; struct Binnod……
什么问题说说,也好排查啊。 如果不是报错,而是结果和楼主预期的不同,还是建议楼主先自己调试看看。
bljswpu 2013-01-01
  • 打赏
  • 举报
回复
引用 2 楼 hekeguang 的回复:
还有,你的main函数里:Preorder(T);是不是也有问题,应该是Preorder1(T)
改了还是有问题
bljswpu 2013-01-01
  • 打赏
  • 举报
回复
#include<stdio.h>
 #include<malloc.h> 
typedef struct Binnode //二叉树结点结构体 
{   
  char data;   
  struct Binnode *lchild; 
    struct Binnode *rchild; 
}Binnode; 
typedef Binnode *Bintree;
 /*  按照前序遍历建立二叉树 */
void Creat_Bintree(Bintree *root) {   
    char ch;    
 while((ch = getchar())!= EOF)  
   if (ch==' ')     {  
       *root=NULL;     
}    
 else    {     
    *root=(Binnode*)malloc(sizeof(Binnode));   
      (*root)->data=ch;  
       Creat_Bintree(&(*root)->lchild);   
      Creat_Bintree(&(*root)->rchild);   
  } 
} 
/* 按照前序递归遍历二叉树 */
void Preorder1(Bintree t) {   
  if (t!=NULL)  
   {         
printf("%c",t->data);       
  Preorder1(t->lchild);   
      Preorder1(t->rchild); 
    }
 } 
int mian(){   
  Bintree T;  
   creat_Bintree(&T); 
    Preorder1(T);   
  return 0; } 
这样还是有问题
bljswpu 2013-01-01
  • 打赏
  • 举报
回复
#include<stdio.h> #include<malloc.h> typedef struct Binnode //二叉树结点结构体 {     char data;     struct Binnode *lchild;     struct Binnode *rchild; }Binnode; typedef Binnode *Bintree; /*  按照前序遍历建立二叉树 */void Creat_Bintree(Bintree *root) {       char ch;     while((ch = getchar())!= EOF)     if (ch==' ')     {         *root=NULL;     }     else    {         *root=(Binnode*)malloc(sizeof(Binnode));         (*root)->data=ch;         Creat_Bintree(&(*root)->lchild);         Creat_Bintree(&(*root)->rchild);     } } /* 按照前序递归遍历二叉树 */void Preorder1(Bintree t) {     if (t!=NULL)     {         printf("%c",t->data);         Preorder1(t->lchild);         Preorder1(t->rchild);     } } int mian(){     Bintree T;     creat_Bintree(&T);     Preorder1(T);     return 0; } 
这样还是有问题
hekeguang 2013-01-01
  • 打赏
  • 举报
回复
还有,你的main函数里:Preorder(T);是不是也有问题,应该是Preorder1(T)
abc41106 2013-01-01
  • 打赏
  • 举报
回复
main里面是不是有问题啊? creat? 还是CreatBintree?

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧