二叉樹是一種很重要的數據結構,在互聯網面試筆試中,二叉樹都是考察的重點和難點。很多關於二叉樹的問題都涉及到了二叉樹的遍歷,根據二叉樹根結點被訪問
的順序,可以將二叉樹的遍歷分為:先序遍歷(根、左、右),中序遍歷(左、根、右),后序遍歷(左、右、根)。二叉樹遍歷的算法可以采用遞歸來實現,也可以采用非遞歸
的方式來實現。由於采用遞歸的方式實現二叉樹的遍歷太簡單,因此在這里直接略過,着重掌握二叉樹遍歷的非遞歸算法。
先序遍歷二叉樹的時候,首先訪問根結點,再訪問左孩子,最后訪問右孩子。在二叉樹先序遍歷非遞歸算法中,先將根結點壓棧,在棧不為空的時候執行循環:
讓棧頂元素p出棧,訪問棧頂元素p,如果p的右孩子不為空,則讓其右孩子先進棧,如果p的左孩子不為空,則再讓其左孩子進棧(注意:進棧順序一定是先右
孩子,再左孩子)。
二叉樹先序遍歷的非遞歸算法實現如下:
#include <stdlib.h> #include <stdio.h> #define MAXSIZE 100 // 定義結點類型 typedef struct node { int data; struct node* lchild; struct node* rchild; } BTnode; void Preorder(BTnode* t) { BTnode* Seqstack[MAXSIZE]; int top = -1; BTnode* p; if(t != NULL) { top++; Seqstack[top] = t; // 先將根結點壓棧 while(top > -1) // 棧不為空時循環 { p = Seqstack[top]; // 棧頂元素出棧 top --; printf("%d ", p->data); // 訪問棧頂元素 if(p->rchild != NULL) // 如果右孩子不為空,則進棧 { top ++; Seqstack[top] = p->rchild; } if(p->lchild != NULL) // 如果左孩子不為空,則進棧 { top ++; Seqstack[top] = p->lchild; } } } }