方法:
1、建立乙個棧;
2、把根節點入棧;
3、取出棧頂元素,訪問這個節點;
4、把當前節點的右子樹入棧,左子樹入棧(非空);
5、回到3重複執行。
源程式:
public
static
void
preorderbyloop
(treenode root)
// 建立乙個棧
stack
stack =
newstack
<
>()
;// 把根節點入閘
stack.
push
(root)
;while
(!stack.
isempty()
)if(cur.left != null)
}}
方法:
1、建立乙個棧;
2、建立乙個引用cur,從root 出發,一路向左跑.遇到的非空節點都入棧,當cur遇到null的時候,就迴圈結束;
3、取出棧頂元素,並訪問(中序的特點就是一路往左找,遇到某個節點的左子樹為空,才能訪問根節點);
4、讓 cur指向該節點的右子樹,回到2繼續執行。
源程式:
public
static
void
inorderbyloop
(treenode root)
stack
stack =
newstack
<
>()
; treenode cur = root;
while
(true
)// 當上面迴圈結束, cur 就已經是 null
// 取出棧頂元素, 並且訪問
if(stack.
isempty()
) treenode top = stack.
pop();
system.out.
print
(top.val)
;// 讓 cur 從 top 的右子樹出發重複上述過程
cur = top.right;
}}
方法:
1、建立乙個棧;
2、搞乙個cur引用,從root出發,一路往左走,遇到非空節點就入棧,遇到空就停止;
3、棧頂元素不能立刻訪問!!得先判定一下:
a)如果棧頂的右子樹為空,那就能訪問該元素了,訪問同時出棧;
b)如果棧頂元素的右子樹前面已經訪問過了,也可以訪問該元素;
如果當前元素不能被訪問,就讓cur指向棧頂的右子樹,重複執行2。
源程式:
public
static
void
postorderbyloop
(treenode root)
// 1. 建立乙個棧
stack
stack =
newstack
<
>()
;// 2. 建立乙個引用 cur, 從 root 出發
treenode cur = root;
// 使用 prev 表示遍歷結果的前乙個元素
treenode prev = null;
while
(true
)// 4. 取出棧頂元素判斷下能不能訪問
if(stack.
isempty()
)// 此處不能直接 pop, 該節點能不能訪問還不知道呢.
// 必須是訪問了才能出棧
treenode top = stack.
peek()
;if(top.right == null || top.right == prev)
else
}}
方法:
1、先把根節點放到佇列裡;
2、進行出佇列操作,並且訪問這個節點
3、把當前節點的左子樹和右子樹再入佇列(空樹就不管了);
4、回到2繼續迴圈執行。
源程式:
public
static
void
levelorder
(treenode root)
// 建立乙個佇列
queue
queue =
newlinkedlist
<
>()
;// 把根節點入佇列
queue.
offer
(root)
;// 迴圈取佇列中的隊首元素
while
(true
)// 訪問當前節點, 直接列印
system.out.
print
(cur.val)
;// 把左右子樹入佇列
if(cur.left != null)
if(cur.right != null)
}}
資料結構 18 二叉樹(非遞迴)
二叉樹 使用非遞迴方法,建立樹 前中後序及層級遍歷樹。建立樹時,按照左子樹小於樹根,右子樹大於樹根,這樣中序遍歷就是有序表 include include 層級遍歷時,用到了queue模板類 include 前中後遍歷時,用到了stack模板類 using namespace std class n...
資料結構 二叉樹的遞迴 非遞迴遍歷
複習一下二叉樹遞迴非遞迴的先中後序遍歷 寫非遞迴後序遍歷的時候卡殼了,參考了一下網上的思路,大概有兩種,一種是標記每個節點是否有走過,如果父節點的左右子節點都標記訪問過,則可以訪問父節點 一種是定義乙個指標,指向上乙個訪問的節點,如果某父節點的右子節點為null或者是上乙個訪問的節點,則該父節點應當...
資料結構之二叉樹
在二叉樹中每個節點最多只能有兩個子節點。即左子節點和有子節點。在二叉樹中最重要的操作應當是遍歷。即按照某一順序訪問二叉樹中的每乙個節點。一般有如下幾種遍歷方法 1 前序遍歷,即先訪問根幾點,然後再訪問左子節點,最後訪問右子節點。2 中序遍歷,即先訪問左子節點,然後再訪問根節點,最後訪問右子節點。3 ...