大家好,请问关于C语言中二叉树的建立问题。已知二叉树的结构,且每个节点均为字符串类型。

节点很多,估计有两百个。如果创建这棵二叉树呢?
也就是我如何将这么多字符串节点一个一个插到这棵树中?

不知表述清楚了没有。。。。。

第1个回答  2011-08-24
2. &和scanf里面的&一样是为了取地址。
1. 传入二级指针是为了修改左右孩子。 createbintree(&(*t)->lchild);和createbintree(&(*t)->rchild)这里如果不用二级指针,那就只能传入左右孩子的值,无法无法修改它们的值。
一般情况下(不用引用的情况下),函数传变量的值的时候就是使用变量的值,也就是变量的一个临时拷贝;而传它的地址的时候一般是为了修改此变量(在函数内可以通过地址找到变量位置,进而修改它)。想想交换变量值的函数为什么要写成 void switch(int *a,int* b)这种形式,就能够明白了。
3. 第一个问题说这么多,第三个就可以简单地说了。void initstack(Stack st) 这种写法,是把一个外部的Stack类的变量拷贝给了st,而那个变量的确是没有初始化的,所以编译错误(应该是警告吧)。而void initstack(Stack *st)这种方式就是传进了那个变量的地址,这样就能在函数内部修改它从而对其初始化了,当然也不会提示错误了。

说这么多,不知说的是否清晰,有什么问题可以继续问
追问

我想 说的是将大量数据传入树结点,但你这个回答,我确实不明白之间的关联。还是谢谢你。

第2个回答  2011-08-24
typedef struct tnode{
char *word;
int count;
struct tnode *left;
struct tnode *right;
}*tnodeptr;
struct tnode *addtree(struct tnode *p, char *w)
{
int cond;
if (p==NULL)
{
p=talloc();//开辟 p的空间
p->word=strdup(w);//w所指字符串付给p->word
p->count=1;//
p->left=p->right=NULL;
}
else if((cond=strcmp(w, p->word))==0) //已有单词, 且相同单词数+1
{
p->count++;
}
else if (cond<0)//有单词但不是相同的且小于的, 往左子树方向插
{
p->left=addtree(p->left, w);
}
else//往右子树方向插
p->right=addtree(p->right, w);
return p;
}追问

楼上的,你的程序中的两个IF比较是啥 呢?可否说明一下?

追答

else if((cond=strcmp(w, p->word))==0) //已有单词, 且相同单词数+1
//if 是判断w与p->word的大小啊, 我是根据先序插入的,就是说一个新的字符串插入的时候,判断它;if 节点上没有单词就是NULL的时候直接插入;如果节点有单词就比较,if 节点上的单词==插入的单词就不插了,记住有两个相同的。if 新插入的单词比节点的小那就往左边查找下去,直到插入; 大于就往右
{
p->count++;
}
else if (condleft=addtree(p->left, w);
}

本回答被提问者采纳

c语言 关于二叉树的创建和遍历(中序遍历)
CreateBiTree(BT,string);\/\/创建二叉树 printf("\\n中序遍历二叉树顺序为: ");inorder(BT);\/\/中序遍历二叉树 printf("\\n");}

请问C语言如何创建二叉树???
struct node* left;struct node* right;} Node;typedef struct { \/\/树根 Node* root;} Tree;void insert(Tree* tree, int value)\/\/创建树 { Node* node=(Node*)malloc(sizeof(Node));\/\/创建一个节点 node->data = value;node->left = NULL;node->right = NULL;if (tree->root == ...

二叉树的建立与遍历(C语言)
cout<<"请选择所需功能('A'输出该二叉树序列,'B'输出交换后二叉树序列)"<<endl;cin>>i;bitreptr p;cout<<"输入数据:";Create(p);switch(i){ case 'A':{ cout<<"前序:";preorder(p);cout<<endl;cout<<"中序:";midorder(p);cout<<endl;cout<<"后序:";...

c语言二叉树问题,勿写代码,求详细思考过程
从后序遍历:CDABE得出E是最顶根节点。然后中序遍历:CADEB得出CAD是E的左子树中的,B是E的右子树中的。再分析后序遍历CDA可以知道A是CD的根,而中序是CAD得到C是A的左子树,D是A的右子树。(如下图)最后,先序遍历:若树不空,则先访问根结点,然后依次先根遍历各棵子树。于是得到结束: ...

建立一棵二叉树,数据以字符串形式从键盘输入。
代码如下:char a[105];int len,i;\/\/i逐渐增加 void build(int s){ if(i==len) return;\/\/已经建完树了 char c=a[i];\/\/当前的字符 i++;if(!tree[s].l) tree[s].l=c;\/\/如果树的左边是空的,就给左边赋值 else tree[s].r=c;\/\/反之 if(c!=' ') build(c);if(c...

...元素均为单字母,试编写算法,按树状打印二叉树的算
同理,第四层的打印空间是9个字符宽,第五层是4个字符宽,第六层是1个字符宽。因此,这个程序最多只能显示6层的二叉树。中序访问二叉树(从右子树开始,而不是左子树)的结点,根据结点的深度打印相应的空格,每打印一个字母就换行,当整个二叉树的中序访问结束后就打印出树状二叉树了。

二叉树(C语言)
这个问题,可以看成完全二叉树,有性质有节点i的父节点为: i\/2.而题目要求的意思也就是找到两个节点的公共父节点。(含可能为其中一个节点)因此,思路如下:输入两个值 x,y 找到较大的那个,(循环的,因不断改变,所以需不断比较)做x=x\/2;(假设此时x较大,x为int 型)然后再比较,,...

...定义二叉树的二叉链表存储结构,完成二叉树的建立,先序中序后序遍历...
Tree;printf("input 根节点: ");create(&Tree);printf("先序遍历:");print1(Tree);printf("中序遍历");print2(Tree);printf("后序遍历");print3(Tree);printf("\\n深 度:%d \\n",depth(Tree));printf("总结点数:%d \\n",Cnode(Tree));printf("叶子结点数:%d\\n",leaf);} ...

关于数据结构C语言二叉树的程序,请人帮忙看看~谢谢
typedef int status; \/\/C中没有status类型,所以想使用这个类型你必须定义它 define OK 0 define ERROR -1 define OVERFLOW -2 \/\/OK、OVERLFLOW、ERROR这些宏的定义头文件中是没有的,所以你必须自己定义它们 typedef struct BiTNode{ char data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;ty...

c语言,二叉树求解~
先考虑度为2的结点,第一层1个,第二层2个,第三层4个,第四层8个,第五层8个,共23个。然后第5层还有8个空位,先假设为叶子节点,即度为0。第五层满,目前总共31个结点。然后第五层的8个度为2的结点可以引申出16个叶子结点,总共47个,以满足题意,假设成立。故6层。当然比较简单的题...

相似回答