根左右
”;左根右
”;左右根
”;前序遍历
和递归
的思想,原因:先有根结点,才有左子树和右子树;后序遍历
和递归
的思想,原因:先销毁左子树,再销毁右子树,最后销毁根结点,可以有效防止内存的泄露
;A
B
D
#
#
E
#
#
C
#
#
前序遍历结果:ABDEC
中序遍历结果:DBEAC
后序遍历结果:DEBCA
#include
#include
#include
//二叉树结构体
typedef struct BiTree{
char data;
struct BiTree *lchild;
struct BiTree *rchild;
}node_t;
//创建二叉树
int create_bin_tree(node_t **root){
if(NULL == root){
printf("入参为NULL\n");
return -1;
}
char val = 0;
scanf("%c",&val);
getchar(); //清理垃圾字符
if('#' == val){
return 0;
}
*root = (node_t *)malloc(sizeof(node_t));
if(NULL == *root){
printf("内存分配失败\n");
return -1;
}
//创建根结点
(*root)->data = val;
(*root)->lchild = NULL;
(*root)->rchild = NULL;
//创建左子树
create_bin_tree(&((*root)->lchild));
//创建右子树
create_bin_tree(&((*root)->rchild));
return 0;
}
//前序遍历
int preorder_tree(node_t *root){
if(NULL == root){
return -1;
}
printf("%c",root->data);
preorder_tree(root->lchild);
preorder_tree(root->rchild);
}
//中序遍历
int inorder_tree(node_t *root){
if(NULL == root){
return -1;
}
inorder_tree(root->lchild);
printf("%c",root->data);
inorder_tree(root->rchild);
}
//后序遍历
int postorder_tree(node_t *root){
if(NULL == root){
return -1;
}
postorder_tree(root->lchild);
postorder_tree(root->rchild);
printf("%c",root->data);
}
//销毁二叉树
int destory_bin_tree(node_t **root){
if(NULL == root || NULL == *root){
return -1;
}
destory_bin_tree(&((*root)->lchild));
destory_bin_tree(&((*root)->rchild));
free(*root);
*root = NULL;
return 0;
}
int main(int argc, char const *argv[]){
node_t *root = NULL;
create_bin_tree(&root);
printf("root = %p\n",root);
printf("前序遍历结果:");
preorder_tree(root);
puts("");
printf("中序遍历结果:");
inorder_tree(root);
puts("");
printf("后序遍历结果:");
postorder_tree(root);
puts("");
destory_bin_tree(&root);
printf("root = %p\n",root);
return 0;
}
A
B
D
#
#
E
#
#
C
#
#
root = 0x560198a85670
前序遍历结果:ABDEC
中序遍历结果:DBEAC
后序遍历结果:DEBCA
root = (nil)