先序遍歷思想如下:
步驟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 ...