二叉樹的非遞迴遍歷 C語言

2021-09-27 08:57:35 字數 1379 閱讀 6280

先序遍歷思想如下:

步驟1:若當前結點有右子樹,則將右子樹結點壓入棧,輸出當前節點並指標往下走指向該節點的左子樹。

步驟2:若左子樹為空,則遍歷右子樹,重複步驟1,若右子樹為空,彈棧輸出指標指向該結點。

中序遍歷思想如下:

步驟1:若當前結點有左子樹,則將當前結點壓入棧,指標往下走指向該節點的左子樹

(相當於一直到最左下方),若無左子樹了,則輸出該結點。

步驟2:若當前結點有右子樹,則指標指向該右子樹,重複步驟1。

若當前結點無右子樹,則彈棧,輸出棧頂元素,並讓指標回退到棧頂元素對應的結點。

若棧為空,則表示遍歷結束。

後序遍歷思想如下:

步驟1:左子樹不為空,將該結點壓入棧,遍歷左子樹

若不為空,則將該結點獲取該節點的右子樹,並把該結點再次壓入棧,遍歷右子樹。

void

unpre_order

(bitnode t)

else

t =linkstack_pop

(&top);}

}

#include

#include

#include

"linkstack.h"

//二叉鏈

struct bitnode

;typedef

struct bitnode bitnode;

typedef

struct bitnode *bitree;

bitnode *

goleft

(bitnode *t, linkstack *s)

while

(t->lchild !=

null

)return t;

}// 非遞迴中序

void

inorder2

(bitnode *t)

//若t沒有右子樹,根據棧頂指示回退

else

if(t->rchild ==

null

)//若t沒有右子樹,並且棧為空

else}}

void

inorder

(bitnode *root)

//遍歷左子樹

inorder

(root->lchild)

;//列印根結點

printf

("%d\n"

,root->data)

;//遍歷右子樹

inorder

(root->rchild);}

intmain

(void

)

二叉樹非遞迴遍歷(c語言)

結果如下圖 號代表null,此時沒有節點 一 在c語言中進行二叉樹的非遞迴遍歷需要用到棧,而在c語言中沒有直接呼叫棧的介面,所以在實現非遞迴遍歷時需要先實現乙個棧,需要用到出棧,入棧,棧頂元素,判斷棧是否為空,這四個介面,別的可以不用實現。二 實現棧的介面 注意 這裡棧的陣列需要用到的型別時node...

C語言二叉樹的非遞迴遍歷

include include using namespace std 1 將根節點 壓入棧中 2 只要 棧size 0 執行迴圈 2.1 拿出棧頂元素 2.2 如果棧頂元素的標誌位 真 直接輸出 執行下一次迴圈 2.3 如果不是真 該flag的標誌位真 2.4 將 右子節點 和 左子節點 和 根 ...

二叉樹遍歷(遞迴 非遞迴)

二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...