1.二叉链表
个人理解:二叉链表结点的结构和双链表一样,都有前后两个指针域,所以二叉链表虽然是树形结构,却依然被称为链表,也正因为它们存储结构的相似之处,我们可以利用一些链表的方法(例如头结点)方便地对二叉树进行操作。
二叉链表的建立和遍历通过递归都比较简单,不多赘述,代码如下
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define elemtype char
typedef struct BiTNode
{
elemtype data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree; //BiTNode代表结点,BiTree代表树
BiTree CreateTree(BiTree &T)
{
elemtype x;
scanf("%c",&x);
fflush(stdin);
if(x=='#') //若输入为'#',则该子树为空
T=NULL;
else
{
T=(BiTree)malloc(sizeof(BiTNode));
T->data=x;
T->lchild=CreateTree(T->lchild);
T->rchild=CreateTree(T->rchild);
}
return T;
}
void PreOrder(BiTree T) //先序遍历
{
elemtype x;
if(T!=NULL)
{
x=T->data;
printf("%c",x);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
void InOrder(BiTree T) //中序遍历
{
elemtype x;
if(T!=NULL)
{
InOrder(T->lchild);
x=T->data;
printf("%c",x);
InOrder(T->rchild);
}
}
void PostOrder(BiTree T)
{
elemtype x;
if(T!=NULL)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
x=T->data;
printf("%c",x);
}
}
void main()
{
BiTree t;
t=CreateTree(t);
printf("先序遍历的结果为:");
PreOrder(t);
printf("\n中序遍历的结果为:");
InOrder(t);
printf("\n后序遍历的结果为:");
PostOrder(t);
printf("\n");
}
建立如图二叉树
编译结果如下
2.线索二叉树
考研中以中序线索二叉树为主,所以本文也以中序为例
个人理解:线索二叉树就是利用二叉链表里叶结点中闲置的n+1个指针域,令其指向遍历序列中的前驱或后继从而便于按顺序遍历链表,例如下图中的二叉树,其中序遍历序列为:425136
其线索二叉树可表示为
解释起来倒是不难理解,而实际操作和运用就需要用心思考琢磨了,代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define elemtype char
typedef struct ThreadNode
{
elemtype data;
struct ThreadNode *lchild,*rchild;
int ltag,rtag;
}ThreadNode,*ThreadTree;
ThreadTree CreateTree(ThreadTree &T) //递归建立二叉树
{
elemtype x;
scanf("%c",&x);
fflush(stdin);
if(x=='#') //若输入为'#',则该子树为空
T=NULL;
else
{
T=(ThreadTree)malloc(sizeof(ThreadNode));
T->data=x;
T->ltag=0;
T->rtag=0; //初始标志域置为0
T->lchild=CreateTree(T->lchild);
T->rchild=CreateTree(T->rchild);
}
return T;
}
void InThread(ThreadTree &p,ThreadTree &pre) //中序遍历,二叉树线索化
{
if(p!=NULL)
{
InThread(p->lchild,pre);
if(p->lchild==NULL) //p左孩子为空则指向pre
{
p->lchild=pre;
p->ltag=1;
}
if(pre!=NULL&&pre->rchild==NULL)
{
pre->rchild=p; //pre右孩子为空则指向p
pre->rtag=1;
}
pre=p;
InThread(p->rchild,pre);
}
}
ThreadTree CreateInThread(ThreadTree T) //建立中序线索二叉树
{
ThreadTree pre=NULL;
if(T!=NULL)
{
InThread(T,pre);
pre->rchild=NULL;
pre->rtag=1;
}
return T;
}
void PrintTree(ThreadTree t) //利用线索按中序打印树的结点元素值
{
while(t->ltag==0)
{
t=t->lchild; //找到中序序列第一个结点
}
while(t!=NULL)
{
printf("%c",t->data);
t=t->rchild;
}
}
int main()
{
char x;
ThreadTree t;
t=CreateTree(t);
t=CreateInThread(t);
PrintTree(t);
return 0;
}
编译结果如下:
总结:二叉树是考研和日后工作中都极为重要的一种结构,务必要学好、学扎实。以后做到二叉树好的题目也会和大家分享。