“ Ctrl AC!一起 AC!”
目录
树的引子
概述
树与生活
查找概述
顺序查找
二分查找
二分模板(更多模板见More model)
树
树的概述
树的基本术语
树的表示
二叉树
概念及形态
二叉树的性质
二叉树的抽象数据类型
二叉树的储存结构
顺序存储:
链表存储:
链表存储的代码描述:
typedef struct TreeNode* BinTree;
struct TreeNode{
ElementType Data;
BinTree Left;
BinTree Right;
}
二叉树的遍历
1.先序的递归遍历:
代码描述:
void PreOrderTraversal(BinTree BT){
if(BT){
printf("%d",BT->Data);
PreOrderTraversal(BT->Left);
PreOrderTraversal(BT->Right);
}
}
2.中序的递归遍历:
代码描述:
void PreOrderTraversal(BinTree BT){
if(BT){
PreOrderTraversal(BT->Left);
printf("%d",BT->Data);
PreOrderTraversal(BT->Right);
}
}
3.后序的递归遍历:
代码描述:
void PreOrderTraversal(BinTree BT){
if(BT){
PreOrderTraversal(BT->Left);
PreOrderTraversal(BT->Right);
printf("%d",BT->Data);
}
}
4.中序非递归遍历:
代码描述:
void InOrderTraversal(BinTree BT){
BinTree T=BT;
Stack S=CreatStack(MaxSize);
while(T||!IsEmpty(S)){
while(T){
Push(S,T);
T=T->Left;
}
if(!IsEmpty(S)){
T=Pop(S);
printf("%5d",T->Data);
T=T->Right;
}
}
}
5.先序的非递归遍历:
void InOrderTraversal(BinTree BT){
BinTree T=BT;
Stack S=CreatStack(MaxSize);
while(T||!IsEmpty(S)){
while(T){
printf("%5d",T->Data);
Push(S,T);
T=T->Left;
}
if(!IsEmpty(S)){
T=Pop(S);
T=T->Right;
}
}
}
6.后序的非递归遍历:
void Post_order(tree L){
tree p=L;
Stack s=CreateStack(MaxSize);
Stack result=CreateStack(MaxSize);
while(p||!IsEmpty(s)){
while(p){
push(s,p);
push(result,p);
p=p->right;
}
if(!IsEmpty(s)){
p=pop(s);
p=p->left;
}
}
while(!IsEmpty(result)){
p=pop(result);
printf("%5d",p->data);
}
}
7.层序遍历:
代码描述:
void LevelOrderTraversal(BinTree BT){
Queue Q; BinTree T;
if(!BT) return;
Q=CreatQueue(MaxSize);
AddQ(Q,BT);
While(!IsEmptyQ(Q)){
T=DeleteQ(Q);
printf("%d\n",T->Data);
if(T->Left) AddQ(Q,T->Left);
if(T->Right) AddQ(Q,T->Right);
}
}
树的应用实例
1.找叶子结点:
2.求树的高度:
3.二元运算:
4.三序知二序确定唯一树
根据前中序或中后序遍历情况可求的唯一确定的二叉树。
感谢阅读!!!
“ Ctrl AC!一起 AC!”