一、二叉树简介:
1、概论:
二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。
2、二叉树的优势:
二叉树在实际使用时会根据链表和有序数组等数据结构的不同优势进行选择。有序数组的优势在于二分查找,链表的优势在于数据项的插入和数据项的删除。但是在有序数组中插入数据较慢,在链表中查找数据项效率较低。综合以上情况,二叉树可以利用链表和有序数组的优势,同时可以合并有序数组和链表的优势,二叉树也是一种常用的数据结构。
3、二叉树的构成:
二叉树由节点(node)和边组成。节点分为根节点、父节点、子节点
如上图,0为根节点,7 ~ 14是3 ~ 6的子节点,3 ~ 6又分别是1 ~ 2的子节点。相反,1 ~ 2是3 ~ 6的父节点,3 ~ 6也是7 ~14的父节点。
二、二叉树简单递归遍历实现:
1、创建树:
typedef struct BiTNode{
TElemType data;
struct BiTNode * lchild, * rchild;
}BiTNode,*BiTree;
BiTree CreateBT(){
TElemType ch;
BiTree T;
ch=getchar();
if(ch =='#'){
T = NULL;
}else{
T = (BiTNode *)malloc(sizeof(BiTNode));
if(!T) exit(-1);
T->data = ch;
T->lchild=CreateBT();
T->rchild=CreateBT();
}
return T;
}
2、先序遍历:
void PreOrder( BiTree T){
if(T)
{
printf("%c\t",T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
3、中序遍历:
void InOrder(BiTree T){
if(T)
{
InOrder(T->lchild);
printf("%c\t",T->data);
InOrder(T->rchild);
}
}
4、后序遍历:
void PostOrder(BiTree T){
if(T) {
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%c\t",T->data);
}
}
5、完整代码:
#include <stdio.h>
#include <stdlib.h>
typedef char TElemType;
typedef struct BiTNode{
TElemType data;
struct BiTNode * lchild, * rchild;
}BiTNode,*BiTree;
BiTree CreateBT(){
TElemType ch;
BiTree T;
ch=getchar();
if(ch =='#'){
T = NULL;
}else{
T = (BiTNode *)malloc(sizeof(BiTNode));
if(!T) exit(-1);
T->data = ch;
T->lchild=CreateBT();
T->rchild=CreateBT();
}
return T;
}
void PreOrder( BiTree T){
if(T)
{
printf("%c\t",T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
void InOrder(BiTree T){
if(T)
{
InOrder(T->lchild);
printf("%c\t",T->data);
InOrder(T->rchild);
}
}
void PostOrder(BiTree T){
if(T) {
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%c\t",T->data);
}
}
int main(){
BiTree T;
printf("请先序输入二叉树:\n");
T=CreateBT();
printf("递归先序遍历:\n");
PreOrder(T);
printf("\n");
printf("递归中序遍历:\n");
InOrder(T);
printf("\n");
printf("递归后续遍历:\n");
PostOrder(T);
printf("\n");
}