关于二叉树的创建思想,总的来说就是先创建根节点,然后创建左子树,创建右子树,和先序遍历的思想一致.
对于二叉树的创建,令我疑惑不解的是用二级指针的操作,会有很多关于指针的操作,但是用二级指针的原因总结起来就是函数的调用是值传递,所以用一级指针需要返回值,而用二级指针不需要返回值.
接下来用代码直观的表示一下.这是节点数据:
typedef struct Node{
char data;
struct Node *lchild,*rchild;
}BiNode,*BiTree;
这是使用二级指针的方法创建:
void CreateBiTree(BiTree *T){
char ch;
scanf("%c",&ch);
if(ch == '#') *T = NULL;//#代表叶子节点是空的
else{
*T = (BiNode*)malloc(sizeof(BiNode)); //分配内存
(*T)->data = ch; // 赋值
CreateBiTree(&(*T)->lchild); // 有左子树就一直创建左子树
CreateBiTree(&(*T)->rchild); // 左子树创建完了创建右子树
}
}
接下来使用一级指针创建:
BiTree CreateTree(){
BiTree T;
char test;
scanf("%c",&test);
if(test == '#') T = NULL;
else{
T = (BiTree)malloc(sizeof(BiNode));
T->data = test;
T->lchild = CreateTree();
T->rchild = CreateTree();
}
return T;
}
可以看到,几乎没什么差别,就是多了个返回值.具体原因请查看这个博客,个人觉得讲的很好点击进入
下面是完整的二级指针的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
char data;
struct Node *lchild,*rchild;
}BiNode,*BiTree;
void CreateBiTree(BiTree *T){
char ch;
scanf("%c",&ch);
if(ch == '#') *T = NULL;
else{
*T = (BiNode*)malloc(sizeof(BiNode));
(*T)->data = ch;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
}
void preOrder(BiTree T){
if(T == NULL) return;
printf("%c",T->data);
preOrder(T->lchild);
preOrder(T->rchild);
}
void InOrder(BiTree T){
if(T == NULL) return;
InOrder(T->lchild);
printf("%c",T->data);
InOrder(T->rchild);
}
void PostOrder(BiTree T){
if(T == NULL) return;
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%c",T->data);
}
int main(int argc, char *argv[]) {
BiTree *T;
printf("请输入二叉树:\n");
CreateBiTree(&T);
printf("先序遍历:\n");
preOrder(T);
printf("\n");
printf("中序遍历:\n");
InOrder(T);
printf("\n");
printf("后序遍历:\n");
PostOrder(T);
return 0;
}
下面是完整的一级指针的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
char data;
struct Node *lchild,*rchild;
}BiNode,*BiTree;
BiTree CreateTree(){
BiTree T;
char test;
scanf("%c",&test);
if(test == '#') T = NULL;
else{
T = (BiTree)malloc(sizeof(BiNode));
T->data = test;
T->lchild = CreateTree();
T->rchild = CreateTree();
}
return T;
}
void preOrder(BiTree T){
if(T == NULL) return;
printf("%c",T->data);
preOrder(T->lchild);
preOrder(T->rchild);
}
void InOrder(BiTree T){
if(T == NULL) return;
InOrder(T->lchild);
printf("%c",T->data);
InOrder(T->rchild);
}
void PostOrder(BiTree T){
if(T == NULL) return;
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%c",T->data);
}
int main(int argc, char *argv[]) {
BiTree T;
printf("请输入二叉树:\n");
T = CreateTree();
printf("先序遍历:\n");
preOrder(T);
printf("\n");
printf("中序遍历:\n");
InOrder(T);
printf("\n");
printf("后序遍历:\n");
PostOrder(T);
return 0;
}
运行结果如下: