树 Tree
一、存储
- 伪代码
typedef struct BiTNode{
ElementType data; // 结点元素数据
struct BiTNode *lchild, *rchild; // 左孩子右孩子指针
}*BiTree;
- C语言实例(部分代码)
typedef int ElementType;
typedef struct BiTNode{
ElementType data; // 结点元素数据
struct BiTNode *lchild, *rchild; // 左孩子右孩子指针
}*BiTree;
二、遍历/搜索
1.先序遍历(DLR)
- 伪代码
(1)递归
void PreOrder(BiTree T)
{
if(T != NULL){
Visit(T); // 访问根节点
PreOrder(T->lchild); // 递归遍历左孩子
PreOrder(T->rchild); // 递归遍历右孩子
}
}
(2)非递归(使用栈)
void PreOrder(BiTree T)
{
Stack S;
InitStack(S);
BiTree p = T;
while(p || !isEmpty(S)){
if(p){
Push(S, p);
Visit(p);
p = p->lchild;
}else{
Pop(S, p);
p = p->rchild;
} // else
} // while
}
2.中序遍历(LDR)
- 伪代码
(1)递归
void InOrder(BiTree T)
{
if(T != NULL){
PreOrder(T->lchild); // 递归遍历左孩子
Visit(T); // 访问根节点
PreOrder(T->rchild); // 递归遍历右孩子
}
}
(2)非递归(使用栈)
void InOrder(BiTree T)
{
Stack S;
InitStack(S);
BiTree p = T;
while(p || !isEmpty(S)){
if(p){
Push(S, p);
p = p->lchild;
}else{
Pop(S, p);
Visit(p);
p = p->rchild;
} // else
} // while
}
3.后序遍历(LRD)
- 伪代码
(1)递归
void PostOrder(BiTree T)
{
if(T != NULL){
PreOrder(T->lchild); // 递归遍历左孩子
PreOrder(T->rchild); // 递归遍历右孩子
Visit(T); // 访问根节点
}
}
(2)非递归(使用栈)
void PostOrder(BiTree T)
{
Stack S;
InitStack(S);
BiTree p = T, r = NULL;
while(p || !isEmpty(S)){
if(p){
Push(S, p);
p = p->lchild;
}else{
Top(S, p);
if(p->rchild != NULL && p->rchild != r){
p = p->rchild;
Push(S, p);
p = p->lchild;
}else{
Pop(S, p);
Visit(p);
r = p;
p = NULL;
} // else2
} // else1
} // while
}
4.层序遍历
- 伪代码(非递归,使用队列)
void LevelOrder(BiTree T)
{
Queue Q;
InitQueue(Q);
BiTree p;
if(T != NULL){
EnQueue(Q, T);
while(!isEmpty(Q)){
p = DeQueue(Q);
Visit(p);
if(p->lchild) EnQueue(Q, p->lchild);
if(p->rchild) EnQueue(Q, p->rchild);
} // while
} // if
}
网友评论