注意
刚开始建立时,觉得代码很简单,然后就卡着了,原因就是创建函数,出不来,一直停留进去。
最后通过看大神的代码才恍然大悟,二叉树的建立,需要按照一棵满二叉树来建立
问题来了,我们的节点不够满二叉树的,这就是关键,空节点也需要补上,
这种方法仅限制在无条件建立二叉树,如果二叉排序树建立二叉树,对于左右子树建立时有条件限制,则不需要补空节点
可参考
回到本题:
比如我们需要创建一棵二叉树
而实际存储的确实:
也就是把空节点NULL补上
设置好空节点使用#代表,输出节点时可以使用个判断语句,将#筛选掉即可。
代码
#include<stdio.h>
#include<malloc.h>
#define LEN sizeof(Bitnode)
//定义二叉树的二叉链表结点结构
typedef struct node {
char data;
struct node *lchild;
struct node *rchild;
} Bitnode,*Bitree;
//按照先序序列创建节点
void CreatBitree(Bitree *root) {
char ch;
ch = getchar();
if(ch=='#') { //# 代表空节点
*root = NULL;
return;
}
else{
*root = (Bitree)malloc(LEN);
(*root)->data = ch;
CreatBitree(&((*root)->lchild));
CreatBitree(&((*root)->rchild));
}
}
//先序遍历二叉树,root为指向二叉树根节点的指针
void Preorder(Bitree root) {
if(root==NULL) return;
// 访问根节点
if(root->data!='#') printf("%c\n",root->data);
Preorder(root->lchild);
Preorder(root->rchild);
}
int main() {
Bitree root=NULL;
printf("请输入二叉树结点:");
CreatBitree(&root);
printf("这棵二叉树先序排列节点为:");
Preorder(root);
return 0;
}
中序、后序类比先序即可。