1. 存储结构
1.1 顺序存储结构
1.2 链式存储结构
typedef strcture BTNode
{
char data;
struct BTNode *lchild;
struct BTNode *rchild;
}BTNode;
1.2.1 孩子存储结构
1.2.2 树的孩子兄弟存储结构
把树转换成二叉树的样子,进行存储
typedef struct BTNode
{
int data;
BTNode* child;
BTNode* sibling;
} BTNode;
// 链接:
A1->child=A2;
A1->sibling=NULL;
A2->sibling= A3;
A3->sibling=A4;
A4->sibling=NULL;
// 取A1孩子结点A3:
A1->child->sibling
2. 遍历
2.1 二叉树的遍历 - 递归算法
void preorder(BTNode *p)
{
if(p!=NULL)
{
//(1)Visit(p)
preorder(p->lchild);
//(2)Visit(p)
preorder(p->rchild);
//(3)Visit(p)
}
}
// 假设访问函数visit()已经定义过
// Visit(p)则在(1)、(2)、(3)处
// 分别是先序、中序和后序遍历。
2.2 层次遍历
需要建立一个循环队列
void level(BTNode *p)
{
int front, rear;
BTNode *que[maxSize];
// 定义一个循环队列,用来记录将要访问
// 的层次上的结点
front = rear=0;
BTNode *q;
if(p!=NULL)
{
rear=(rear+1)%maxSize;
que[rear]=p; // 根节点入队
while(front!=rear) //当队列不空的时候进行循环
{
front=(front+1)%maxSize;
q = que[front]; // 队头结点出队
Visit(q); //放问队头结点
if(q->lchild!=NULL) //如果左子树不空,则左子树的根结点入队
{
rear=(rear+1)%maxSize;
que[rear]=q->lchild;
}
if(q->rchild!=NULL) // 如果右子树不空,则右子树的根节点入队
{
rear=(rear+1)%maxSize;
que[rear]=q->rchild
}
}
}
}
2.3 线索二叉树
2.3.1 线索化
通过中序遍历对二叉树线索化的递归算法
void InThread(TBTNode *p, TBTNode *&pre)
{
if(p!=NULL)
{
InThread(p->lchild,pre);
if(p->lchile==NULL)
/* 建立当前结点的前驱线索 */
{
p->lchild=pre;
p->ltag=1;
}
if(pre!=NULL&&pre->rchild==NULL)
/* 建立前驱结点的后继线索 */
{
pre->rchild=p;
pre->rtag=1;
}
pre=p;
//pre指向当前的p,作为p将要指向的下一个结点的前驱结点指示指针
p=p->rchild;
//p指向一个新结点,此时pre 和p分别指向的结点形成了一个前驱后继对
InThread(p,pre)
}
}
2.3.2 建立中序线索二叉树
通过中序遍历建立中序线索二叉树
void createInThread(TBTNode *root)
{
TBTNode *pre=NULL; //前驱结点指针
if(root!=NULL)
{
InThread(root,pre);
pre->rchild=NULL; //非空二叉树,线索化
pre->rtag=1 //后处理中序最后一个结点
}
}
2.3.3 遍历中序线索二叉树
求以p为根的中序线索二叉树中,中序序列下的第一个结点
TBTNode *First(TBTNode *p)
{
while(p->ltag==0)
p=p->lchild; // 最左下结点(不一定是叶结点)
return p;
}
求在中序线索二叉树中,结点p在中序下的后继结点
TBTNode *Next(TBTNode *p)
{
if(p->rtag==0)
return First(p->rchild);
else
return p->rchild; //rtag==1,直接返回后继线索
}
遍历中序线索二叉树
void Inorder(TBTNode *root)
{
for(TBTNode *p=First(root);p!=NULL;p=Next(p))
Visit(p)
}