一、二叉树的链式存储:
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;//结点数据
BinTree Left;//指向左子树
BinTree Right;//指向右子树
};
二、遍历(先序,中序、后序、层序)
先序遍历(递归):
对结点的访问是在其左、右子树遍历之前进行的
过程:
1.访问根节点
2.先序遍历其左子树
3.先序遍历其右子树
void PreorderTraversal(BinTree BT)
{
if(BT){
printf("%d ",BT->Data );
PreorderTraversal(BT->Left );
PreorderTraversal(BT->Right );
}
}
中序遍历(递归):
对树中的任一结点的访问是在遍历其左子树后进行的,访问该结点后,在遍历其右子树
过程:
1.中序遍历其左子树
2. 访问根节点
3.中序遍历其右子树
void InorderTraversal(BinTree BT)
{
if(BT){
InorderTraversal(BT->Left );
printf("%d ",BT->Data );//数据类型根据要求变化
InorderTraversal(BT->Right );
}
}
中序遍历(非递归):
void InorderTraversal(BinTree BT)
{
BinTree T;
Stack S=CreateStack();//创建空堆栈
T=BT;//从根节点出发
while(T||!IsEmpty(S)){
while(T){
//一直向左并将沿途结点压入堆栈
Push(S,T);
T=T->Left ;
}
T=Pop(S);//弹出堆栈
printf("%d",T->Data );//打印结点
T=T->Right ; //转向右子树
}
}
后序遍历(递归):
结点左右子树的遍历先进行,然后访问该结点
过程:
1.后序遍历其左子树
2.后序遍历其右子树
3. 访问根结点