二叉樹是一種很重要的數據結構,在互聯網面試筆試中,二叉樹都是考察的重點和難點。不少關於二叉樹的問題都涉及到了二叉樹的遍歷,根據二叉樹根結點被訪問node
的順序,能夠將二叉樹的遍歷分爲:先序遍歷(根、左、右),中序遍歷(左、根、右),後序遍歷(左、右、根)。二叉樹遍歷的算法能夠採用遞歸來實現,也能夠採用非遞歸面試
的方式來實現。因爲採用遞歸的方式實現二叉樹的遍歷太簡單,所以在這裏直接略過,着重掌握二叉樹遍歷的非遞歸算法。算法
先序遍歷二叉樹的時候,首先訪問根結點,再訪問左孩子,最後訪問右孩子。在二叉樹先序遍歷非遞歸算法中,先將根結點壓棧,在棧不爲空的時候執行循環:數據結構
讓棧頂元素p出棧,訪問棧頂元素p,若是p的右孩子不爲空,則讓其右孩子先進棧,若是p的左孩子不爲空,則再讓其左孩子進棧(注意:進棧順序必定是先右spa
孩子,再左孩子)。code
二叉樹先序遍歷的非遞歸算法實現以下:blog
#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; } } } }