二叉树
简要
二叉树是一种特殊的树,它只有两个节点,左节点和右节点,满二叉树和完全二叉树这里就不做介绍了。
和前面讲述的一样,也有链式和顺序表达,比较常用的链式,树的结构体表示为递归形式,就是在结构体里面再来一个结构体,然后结构体里面再来结构体,就构成了二叉树的数据结构。因此就有了二叉树的节点定义:
因此以上为树节点的结构图,中间为数据域,两边为指针域,实现链式的实现,和之前讲的链式表类似。每个节点为数据域和指针域,只是树节点为两个指针域,实现左右节点的连接
typedef struct BiTNode{
ElemType data; //创造数据域
struct BiTNode *lchild,*rchild; //创造左右子树指针域,实现左右子树的连接
} BiTNode,*BiTree;
二叉树的初始化创建都为递归形式来创建,二叉树结构体如上所示就为递归形式.这里假设创建二叉树的数据域为字符。
void CreateTree(BiTree &T)
{
char t;
scanf("%c",&t);
getchar(); //消除回车键的影响,否则会直接进行两次scanf,导致第二次scanf失效
if(t==' ') T=NULL; //当输入为空格的时候,表示子树为空
else
{
if(!(T=(BiTNode*)malloc(sizeof(BiTNode)))) exit;
T->i=t; //将数据域赋值
CreateTree(T->lchild); //使用递归的方法创建子树,可以自己画一个三个节点的简单二叉树示范
CreateTree(T->rchild);
}
}
假设构建一个简单二叉树,流程如下图所示
还有不理解的可以自己画图,假设创建一个简单的二叉树,一步一步递归即可。
遍历二叉树有,前序中序后序,三种遍历,比较常用中序,先访问左子树,后中,再右,需要栈的辅助作用来,创建栈的一些列操作看前面文章。
该遍历方法为非递归遍历,即索引,当为空就弹栈,使指针指向当初的节点再进行对右子树的遍历
void InOrderTraverse(BiTree &T)
{
Stack S; //创建一个辅助栈
InitStack(S); //初始化栈
BiTNode *p;
p=T; //实现与需要操作的二叉树进行绑定
while(p||StackEmpty(S)) //当p为空说明已经遍历完所有的节点
{
if(p){
Push(S,p); //如果p不为空,说明节点存在,就放入栈中,然后访问左子树,左子树存在,再访问左子树 的左子树,以此类推,若左子树不存在,转到右子树。
p=p->lchild;
}
else
{ //当左子树不存在就转到该流程
Pop(S,p);
printf("%c",p->i); //对节点数据的处理,可以根据个人来改变
p=p->rchild; //然后对右子树遍历,若右子树也为空,则会退到上一级,对上一级的右子树遍历
}
}
}
这个过程比较难理解,可以画一个简单的二叉树来理解。
最近发现了一个国外挺牛的网站,将所有数据结构都实现了可视化。你可以调节演示速度,有各种算法演示,比如什么查找之类,红黑树,什么都有。可能就是全英文,看不懂的可以用浏览器的翻译软件。地址如下: