非递归遍历二叉树
一、层次遍历:借助队列实现
1 void LevelOrderTraversal(BiTree root) 2 { 3 BiTree e = root;//从根节点开始 4 Queue *q; 5 InitQueue(q); 6 7 if(e)//若根结点非空,则入队列 8 { 9 EnQueue(q,e); 10 } 11 12 while(!QueueEmpty(q)) 13 { 14 DelQueue(q,e); 15 Visit(e); 16 if(e->leftChild)//左孩子不空,入队列 17 { 18 EnQueue(q,e->leftChild); 19 } 20 if(e->rightChild)//右孩子不空,入队列 21 { 22 EnQueue(q,e->rightChild); 23 } 24 } 25 }
二、先序、中序、后序遍历:借助栈实现
(1)先序遍历
void PreorderTranversal(BiTree root){ Stack *s; InitStack(s); //栈底指针 BiTree e = root; //根节点 while(e!=null || !StackEmpty(s)){ while(e!=null){ visit(e); Push(s,e);//入栈 e= e->leftChild; } if(!StackEmpty(s)){ GetTop(s,e); Pop (s,e);//出栈 e =e->rightChild;//在此以右节点为根节点循环以上过程 } }
(2)中序遍历
1 void InorderTranversal(BiTree root){
2 Stack *s;
3 InitStack(s); //栈底指针
4 BiTree e = root; //根节点
5 while(e!=null || !StackEmpty(s)){
6 while(e!=null){
7 Push(s,e);//入栈
8 e= e->leftChild;
9 }
10
11 if(!StackEmpty(s)){
12 GetTop(s,e);
13 visit(e);
14 Pop (s,e);//出栈
15 e =e->rightChild;//在此以右节点为根节点循环以上过程
16 }
17 }
(3)后序遍历
1 typedef struct AssistNode{
2 BiTree bi;
3 int isFirst= false;//表示是第一次还是第二次出栈
4 }*Assist;
5
6 void PostorderTranversal(BiTree root){
7 //此处Stack结构中的元素为Assist类型
8 Stack *s;
9 InitStack(s); //栈底指针
10 BiTree e = root; //根节点
11 while(e!=null || !StackEmpty(s)){
12 while(e!=null){
13 Assist assist=(Assist*)malloc(sizeof(Assist));
14 //将e封装到assist里面并加标记
15 assist->bi= e;
16 assist->isFirst= true;
17 Push(s,assist);//入栈
18 e= e->leftChild;
19 }
20
21 if(!StackEmpty(s)){
22 GetTop(s,assist);
23 Pop (s,assist);//出栈
24 if(assist->isFirst=true){
25 //如果是第一次取出,则以该节点作为根节点循环
26 assist->isFirst=false;
27 Push(s,assist);
28 e=assist->bi->rightChild;
29 }else{
30 //如果是第二次取出,则访问,并在下个循环中向上一级访问(取出的新的节点为其父节点)
31 visit(assist->bi);
32 e=null;
33 }
34 }
35 }