二叉樹遍歷非遞歸算法——先序遍歷

  二叉樹是一種很重要的數據結構,在互聯網面試筆試中,二叉樹都是考察的重點和難點。不少關於二叉樹的問題都涉及到了二叉樹的遍歷,根據二叉樹根結點被訪問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;
            }
        }
    }
}
相關文章
相關標籤/搜索