二叉树的抽象数据类型定义
ADT BinaryTree
{
数据对象:具有相同性质的数据元素的集合
数据关系:
基本操作:CreateBiTree(&T,definition )…
}
二叉树的存储
二叉树的顺序存储
按照满二叉树的编号顺序依次存储在顺序表中
-
二叉树的定义
#typedef MAXSIZE 100
TypedefTELemType SqBitree[MAXSIZE]
SqBiTree bt;
顺序存储结构适合满二叉树和顺序二叉树的存储,普通二叉树使用顺序存储结构容易浪费存储空间。
二叉树的链式存储
-
二叉链表的定义
typedef struct BiNode { TElemtype data; struct BiNode *rchild,*lchild; }BiNode ,*Bitree;
如果是三叉链表多一个指向双亲的指针
二叉树的遍历
按照先左后右的原则遍历方法:DLR——先(根)序遍历、LDR——中(根)序遍历、LRD——后(根)序遍历
-
先序递归遍历
Status PreOrderTraverse(BiTree T) { if (T=null)return OK; //空二叉树 else { visit(T); PreOrderTraverse(T->lchild);//递归遍历左子树 PreOrderTraverse(T->rchild);//递归遍历右子树 } }
-
中序递归遍历
Status InOrderTraverse(BiTree T) { if (T=null)return OK; //空二叉树 else { InOrderTraverse(T->lchild);//递归遍历左子树 visit(T); InOrderTraverse(T->rchild);//递归遍历右子树 } }
-
后序递归遍历
Status PostOrderTraverse(BiTree T) { if (T=null)return OK; //空二叉树 else { PostOrderTraverse(T->lchild);//递归遍历左子树 PostOrderTraverse(T->rchild);//递归遍历右子树 visit(T); } }
-
中序遍历非递归算法
基本思想:建立一个栈——>根结点进栈,遍历左子树——>根结点出栈。输出根结点,遍历右子树。Status InOrderTraverse(BiTree T) { BiTree p;InitStack(S);p=T; while(p||!StackEmpty(s)) { if(p) { push(S,p); p=p->lchild; } else { Pop(S,q); printf("%c",q->data); p=q->rchild; } } return ok; }
按照层次遍历的方法,从上到下,从左到右的顺序依次访问每一个结点,每个结点只访问一次。
-
顺序循环队列定义
typedef struct{ BTNode data[MAXSIZE]; // int front,rear;//对头、队尾指针 }SqQueue;
-
二叉树层次遍历算法
void LevelOrder(BTNode *b) { BTNode *p;SqQueue *qu; InitQueue(qu); //初始化队列 enQueue(qu,b); //根结点指针进入队列 while(!QueueEmpty(qu)) //队不为空 { deQueue(qu,p); //出队结点p printf("%c",p->data); //访问结点p if(p->lchild!=Null) enQueue(qu,p->lchild); //有左孩子时将其进队 if(p->rchild!=Null) enQueue(qu,p->rchild); //有右孩子时将其进队 } }