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

2021-10-23 04:35:04 字數 3971 閱讀 3141

結果如下圖:

#號代表null,此時沒有節點

一、在c語言中進行二叉樹的非遞迴遍歷需要用到棧,而在c語言中沒有直接呼叫棧的介面,所以在實現非遞迴遍歷時需要先實現乙個棧,需要用到出棧入棧棧頂元素判斷棧是否為空,這四個介面,別的可以不用實現。

二、 實現棧的介面

注意:這裡棧的陣列需要用到的型別時node 型別的,所以先把二叉樹節點node定義出來才能才能使用node這個型別

typedef

struct node//定義樹的乙個節點

node;

進行棧的介面實現

typedef node* sdatatype;

typedef

struct stack//定義棧

stack;

void

stackinit

(stack *st)

//棧的初始化

void

stackinsert

(stack *st, sdatatype value)

//入棧

st->_array[st->_size]

= value;

st->_size++;}

void

stackdel

(stack *st)

//出棧

st->_size--;}

sdatatype stacktop

(stack *st)

//獲取棧頂元素

intstackempty

(stack *st)

//判斷棧是否為空

return0;

}

三、建立一棵樹

可以用前序遍歷去建立一棵樹

這裡的#號是代表null的,不太懂怎樣建樹的可以先把牛客上的一道題做完之後就會用各種方法去建樹了,

鏈結在這:

node *

treecreat

(bdatatype *array,

int*pos)

//建立一棵樹,後面會對這棵樹進行各種排序

else

}

四、非遞迴去實現三種遍歷

1、前序遍歷

先遍歷當前節點的最左路徑,再遍歷最後訪問節點的右子樹

void

preorder

(node *root)

//前序遍歷非遞迴

//獲取棧頂元素

top =

stacktop

(&st)

;stackdel

(&st)

;//訪問右子樹

cur = top->_right;

}printf

("\n");

}

2、中序遍歷

當前節點先壓棧不能訪問,只有左子樹訪問完之後,才能訪問最後壓棧的節點以及他的右子樹

void

midorder

(node *root)

//中序遍歷非遞迴

top =

stacktop

(&st)

;stackdel

(&st)

;printf

("%c "

, top->_data)

; cur = top->_right;

}printf

("\n");

}

3、後序遍歷

後序遍歷相對於前兩種有點麻煩,看不懂了可以私聊我

void

endorder

(node *root)

//後序遍歷非遞迴

top =

stacktop

(&st);if

(top->_right ==

null

|| top->_right == prev)

else

}printf

("\n");

}

**如下

#include

#include

#pragma warning(disable:4996)

//定義乙個棧可以實現入棧出棧獲取棧頂元素的操作

#define num 10

typedef

char bdatatype;

typedef

struct node//定義樹的乙個節點

node;

typedef node* sdatatype;

typedef

struct stack//定義棧

stack;

void

stackinit

(stack *st)

//棧的初始化

void

stackinsert

(stack *st, sdatatype value)

//入棧

st->_array[st->_size]

= value;

st->_size++;}

void

stackdel

(stack *st)

//出棧

st->_size--;}

sdatatype stacktop

(stack *st)

//獲取棧頂元素

intstackempty

(stack *st)

//判斷棧是否為空

return0;

}//用棧來實現二叉樹的非遞迴的三種遍歷方法

//先建立乙個樹

node *

treecreat

(bdatatype *array,

int*pos)

//建立一棵樹,後面會對這棵樹進行各種排序

else

}//1、前序遍歷

void

preorder

(node *root)

//前序遍歷非遞迴

top =

stacktop

(&st)

;stackdel

(&st)

; cur = top->_right;

}printf

("\n");

}//2、中序遍歷

void

midorder

(node *root)

//中序遍歷非遞迴

top =

stacktop

(&st)

;stackdel

(&st)

;printf

("%c "

, top->_data)

; cur = top->_right;

}printf

("\n");

}//3、後序遍歷

void

endorder

(node *root)

//後序遍歷非遞迴

top =

stacktop

(&st);if

(top->_right ==

null

|| top->_right == prev)

else

}printf

("\n");

}int

main()

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

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

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

先序遍歷思想如下 步驟1 若當前結點有右子樹,則將右子樹結點壓入棧,輸出當前節點並指標往下走指向該節點的左子樹。步驟2 若左子樹為空,則遍歷右子樹,重複步驟1,若右子樹為空,彈棧輸出指標指向該結點。中序遍歷思想如下 步驟1 若當前結點有左子樹,則將當前結點壓入棧,指標往下走指向該節點的左子樹 相當於...

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

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