一.二叉树的遍历
1.前序遍历,中序遍历,后续遍历
都是用递归来实现
//拿中序遍历举例
void InOrder(BiTree root)
{
if(root != NULL)
{
InOrder(root->left);
Visit(root->date);
InOrder(root->right);
}
}
2.不用递归的中序遍历
递归实际上就是一个栈的原理,所以就可以借助一个栈来代替递归
//以中序遍历为例
void InOrder(BiTree root)
{
Bitree p;//用来表示当前处理的结点
Bitree q;//用来接收弹出栈的栈顶元素
InitStack (&S);
p = root;//先从root结点开始处理
while(p || !IsEmpty(S))
{
if(p)
{
Push(&S,p);
p = p->left;
}
else
{
Pop(&S,q);
visit(q->data);
p = q->right;
}
}
}
3.二叉树的层次遍历
层次遍历需要使用到队列(先进先出)
队列的初始化如下:
typedef struct
{
BTNode data[MaxSize];//存放队中的元素
int front,rear;//dui头和队尾指针
}SqQueue;
层次遍历算法:
void LevelOrder(BTNode *b)
{
BTNode *p;//当前处理的结点
SqQueue *qu;
initqueue(qu);
enqueue(qu,b);//根节点指针进入队列
while(!empty(qu))//只要队列不为空就一直循环
{
dequeue(qu,p);//出列给p
visit(p->data);
if(p->left) enqueue(qu,p->left);
if(p->right) enqueue(qu,p->right);
}
}
二:二叉树遍历算法的应用
1.二叉树的建立
使用先序序列建立二叉树的二叉链表
首先的基本思想就是:先根再左再右
很显然如果直接:abcdegf 会有很多结果。所以要把没有结点的地方用一个空结点补上。使得最后的所有的叶子节点都是空结点。
如下:
输入的时候 # 表示空结点
所以输入时:
A B C # # D E # G # # F # # #
代码如下:
//递归写法
void CreatBiTree(Bitree &T)
{
cin>>ch;
if(ch=='#')
{
T = NULL;
}
else
{
T = new Bitree;
CreatBiTree(T->left);//构造左子树
CreatBiTree(T->right);
}
cout<< "OK!"<<endl;
}
2.二叉树的复制
与二叉树的创建同理
//复制二叉树
void CopyBitree(Bitree T,Bitree &newT)
{
//先复制再左子树然后右子树
if(T = NULL) newT = NULL;
else
{
newT = new Bitree;
newT->data = T->data;
CopyBitree(T->left,newT->left);
CopyBitree(T->right,newT->right);
}
}
3.二叉树的线索化
略(见课本174页)
三:习题
1.已知前序和中序列表求后续列表
跟下面的道理一样
2.已知后序和中序列表求前序列表
已知二叉树的中序遍历顺序为DBAGEHCF,后序遍历顺序为DBGHEFCA,求该二叉树的前序遍历。
后序遍历的最后一个结点一定是根节点
所以根节点是A
然后看A再中序中的位置
在A左面的是左子树,右面的是右子树
然后分别看左子树和右子树这一团,按照同样的方法再次细分即可