为什么我这样创建二叉树不对?它一直提示输入数值,好像进入了死循环。
#include <stdio.h>
#include <stdlib.h>
typedef struct BinaryNode{
char data;
BinaryNode *left;
BinaryNode *rigth;
}
BinaryTree;
void CreateBinaryTree(BinaryTree *bina)
{
char ch;
printf("请输入节点的数值(.表示该节点为空):\n");
ch = getchar();
if(ch == '.')
bina = NULL;
else
{
bina = (BinaryTree*)malloc(sizeof(BinaryNode));
bina ->data = ch;
CreateBinaryTree(bina ->left);
CreateBinaryTree(bina ->rigth);
}
}
int main()
{
BinaryTree *bina;
bina = (BinaryTree *)malloc(sizeof(BinaryNode));
CreateBinaryTree(bina);
return 0;
}
[解决办法]
printf("请输入节点的数值(.表示该节点为空):\n");
scanf("%c", &ch);//ch = getchar();改成这样,因为有数据残留在缓冲区
[解决办法]
- C/C++ code
printf("请输入节点的数值(.表示该节点为空):\n");fflush(stdin);//或者在这儿加句这个ch = getchar();
[解决办法]
你这个代码有很大的问题。
在main()函数中
bina = (BinaryTree *)malloc(sizeof(BinaryNode));
CreateBinaryTree(bina);
也就是bina已经是root节点了,但是在CreateBinaryTree里,有分配了一个
bina = (BinaryTree*)malloc(sizeof(BinaryNode));
而且这两个节点没有任何关系。
[解决办法]
- C/C++ code
//bina = (BinaryTree *)malloc(sizeof(BinaryNode));把这句去掉CreateBinaryTree(bina);
[解决办法]
void CreateBinaryTree(BinaryTree* &bina)//这儿改成这个
[解决办法]
按照czh3642210的修改,然后在bina = (BinaryTree*)malloc(sizeof(BinaryNode));后加上
bina->left = 0
bina->right = 0
就应该不会死循环了,你试试
[解决办法]
关键是你没有把创建的孩子节点和父节点连接起来。
- C/C++ code
#include <stdio.h>#include <stdlib.h>typedef struct BinaryNode{ char data; struct BinaryNode *left; struct BinaryNode *rigth;}BinaryTree;void CreateBinaryTree(BinaryTree **pbina){ char ch;// printf("请输入节点的数值(.表示该节点为空):\n"); ch = getchar(); if(ch == '.') *pbina = NULL; else { *pbina = (BinaryTree*)malloc(sizeof(struct BinaryNode)); (*pbina)->data = ch; CreateBinaryTree(&(*pbina) ->left); CreateBinaryTree(&(*pbina) ->rigth); }}void Travel(BinaryTree * T){ if(T != NULL) { printf("%c", T->data); Travel(T->left); Travel(T->rigth); }}int main(){ BinaryTree *bina; bina = (BinaryTree *)malloc(sizeof(struct BinaryNode)); CreateBinaryTree(&bina); Travel(bina); return 0;}
[解决办法]
注意 指向指针的指针的使用.. 我当年做二叉树的时候就因为不懂这个东西(当时还不会调试),活生生的看了一个星期的代码,最后还是没做出来...