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


  二叉樹是一種很重要的數據結構,在互聯網面試筆試中,二叉樹都是考察的重點和難點。很多關於二叉樹的問題都涉及到了二叉樹的遍歷,根據二叉樹根結點被訪問

的順序,可以將二叉樹的遍歷分為:先序遍歷(根、左、右),中序遍歷(左、根、右),后序遍歷(左、右、根)。二叉樹遍歷的算法可以采用遞歸來實現,也可以采用非遞歸

的方式來實現。由於采用遞歸的方式實現二叉樹的遍歷太簡單,因此在這里直接略過,着重掌握二叉樹遍歷的非遞歸算法。

  先序遍歷二叉樹的時候,首先訪問根結點,再訪問左孩子,最后訪問右孩子。在二叉樹先序遍歷非遞歸算法中,先將根結點壓棧,在棧不為空的時候執行循環:

讓棧頂元素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;
            }
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM