前序遍歷
知識點總結報告
知識點:
前序遍歷
(原理)前序遍歷二叉樹過程
(1)訪問根結點
(2)先序遍歷左子樹
(3)先序遍歷右子樹
中序遍歷遞歸算法
void PreOrder(BTNode *b) //先序遍歷的遞歸算法
{ if (b!=NULL)
{ printf("%c ",b->data); //訪問根節點
PreOrder(b->lchild); //遞歸訪問左子樹
PreOrder(b->rchild); //遞歸訪問右子樹
}
}
前序遍歷非遞歸算法
采用順序棧存儲結構,類型聲明如下
typedef struct //存放棧中數據元素
{ BTNode * data[MaxSize]; //存放棧頂指針
int top; //順序棧存儲類型
}SqStack;
非遞歸算法1
void PreOrder1(BTNode *b) //先序非遞歸遍歷算法1
{ BTNode *p;
SqSack *st; //定義棧指針st
InitStack(st); //初始化棧st
if(b!=NULL)
{ Push(st,b); //根結點進棧
while(!=StackEmpty(st)) //棧不為空時循環
{ Pop(st,p); //退棧結點p並訪問它
printf("%c",p->data);
if(p->rchild!=NULL) //有右孩子時將其進棧
Push(st,p->rchild);
if(p->lchild!=NULL) //有左孩子時將其進棧
Push(st,p->lchild);
}
printf("\n");
}
DestroyStack(st); //銷毀棧
}
二叉鏈表中前序遍歷非遞歸算法
void PreOrder2(BTNode *b) //先序遍歷非遞歸算法2
{ BTNode *p;
SqStack *st; //定義一個順序棧指針st
InitStack(st); //初始化棧st
p=b;
while(!StackEmpty(st)||p!=NULL)
{ while(p!=NULL) //訪問結點p及其所有左下結點並進棧
{ printf("%c",p->data); //訪問結點p
Push(st,p); //結點p進棧
p=p->lchild; //移動到左孩子
}
if(!StackEmpty(st)) //若棧不空
{ Pop(st,p); //出棧結點p
p=p->rchild; //轉向處理其右子樹
}
}
printf("\n");
DestroyStack(st); //銷毀棧
}
前序遍歷