定义
二叉树是每个节点最多有两个子树的树结构。在图论中是这样定义的:二叉树是一个连通的无环图,并且每一个顶点的度不大于3。有根二叉树还要满足根结点的度不大于2。有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结点。
前驱:指前面一个支点
后继:指后面一个支点
基本概念
二叉树是递归定义的,其结点有左右子树之分,因此它有以下5种形态:
(1)空二叉树——如图(a);
(2)只有一个根结点的二叉树——如图(b);
(3)只有左子树——如图(c);
(4)只有右子树——如图(d);
(5)完全二叉树——如图(e)。
二叉树的2种储存结构:链式存储、线性存储
(1)线性存储(用数组存)
(2)链式存储(用结构体类的指针存)
用代码表示就是:
//节点类型
typedef struct Node {
char data; //节点数据
struct Node *lchild; //指向左孩子的指针
struct Node *rchild; //指向右孩子的指针
} node;
遍历顺序
先根(序)遍历:根、左子树、右子树
例如上面一个图用先根遍历表示就是:ABDCEF
相关代码如下 :
void dispPreOrder(Node *root)
{
if(root!=NULL)
{
printf("%c",root->data); //先处理他的根
dispPreOrder(root->lchild); //再处理他的左子树
dispPreOrder(root->rchild); //最后处理他的右子树
}
}
中根(序)遍历:左子树、根、右子树
例如上面的辣个图用中根遍历表示就是:DBAECF
相关代码如下:
void dispInOrder(Node *root)
{
if(root!=NULL)
{
dispInOrder(root->lchild); //同样先处理他的左子树
printf("%c",root->data); //然后输出根
dispInOrder(root->rchild); //最后处理它的右子树
}
}
后根(序)遍历:左子树、右子树、根
例如上面的图用后根遍历表示就是:DBEFCA 相关代码如下:
void dispPostOrder(Node *root)
{
if(root!=NULL)
{
dispPostOrder(root->lchild); //这个就不用说了,同上
dispPostOrder(root->rchild);
printf("%c",root->data);
}
}
构造二叉树:
根据中序,先序构造二叉树
node *createBinaryTree_In_Pre(char *pre,char *in,int n)
{
node *b;
char *p;
int k;
if(n<=0)
return NULL;
b=(node*)malloc(sizeof(node));
b->data=*pre;
for(p=in;p<=in+n;p++)
{
if(*p==*pre)
break;
}
k=p-in;
b->lchild=createBinaryTree_In_Pre(pre+1,in,k);
b->rchild=createBinaryTree_In_Pre(pre+k+1,p+1,n-k+1);
return b;
}
根据中序,后序构造二叉树
node *createBinaryTree_In_Post(char *post,char *in,int n)
{
node *b;
char r,*p;
int k;
if(n<=0)
return NULL;
r=*(post+n-1);
b=(node*)malloc(sizeof(node));
b->data=r;
for(p=in;p<in+n;p++)
{
if(*p==r)
break;
}
k=p-in;
b->lchild=createBinaryTree_In_Post(post,in,k);
b->rchild=createBinaryTree_In_Post(post+k,p+1,n-k-1);
return b;
}