一、前言
關於二叉樹的的基本操作以及初階的面試題在前面的部落格已經有所描述,這篇關於二叉樹資料結構的最終篇部落格就來簡單介紹一下用非遞迴的方式來實現二叉樹的前序、中序、後序遍歷
二、二叉樹的非遞迴實現先序遍歷
2.1 實現原理
① 一般非遞迴方式實現遞迴操作都需要用到棧
② 先序遍歷:
1)創造乙個棧 初始情況下 把根節點入棧
2)進入迴圈
a)取棧頂元素(出棧)
b)訪問該元素
c)如果該元素右子樹不為空就入棧;如果該元素左子樹不為空也入棧 當棧為空的時候,遍歷就完成了
2.2 **實現
public
void
preorder
(treenode root)
stack
stack=
newstack
<
>()
; stack.
push
(root)
;while
(!stack.
empty()
)if(top.left!=null)
}}
三、二叉樹的非遞迴實現中序遍歷
3.1 實現原理
① 中序遍歷也是需要依賴乙個棧
② 中序遍歷:
注意:1.設定乙個cur引用 從root出發 只要cur不為空 就把cur入棧 同時cur往左移動
2.cur為空 此時棧頂元素就是當前最左側元素 出棧並訪問棧頂元素
3.讓cur指向被訪問節點右子樹迴圈執行1,2步驟
3.2 **實現
public
void
inorder
(treenode root)
stack
stack=
newstack
<
>()
; treenode cur=root;
while
(true
)//2.取棧頂元素並訪問 如果遇到空棧就訪問完畢了
if(stack.
empty()
) treenode top=stack.
pop();
system.out.
print
(root.val+
" ")
;從top的右子樹出發,重複1,2
cur=top.right;
}}
四、二叉樹的非遞迴實現後序遍歷
4.1 實現原理
① 後序遍歷 和中序相似 , 依賴乙個棧
② 後序遍歷 :
1.建立乙個cur從root出發 , 只要cur不為空 就把cur入棧 同時往左移動
2.cur為空 取棧頂元素,看能不能訪問
注意 :
a) 在後序遍歷中右子樹的根節點和根節點是相鄰的
b) 能訪問的條件 : 棧頂元素右子樹為null或者棧頂元素右子樹已經被訪問過了
3.如果當前棧頂元素不滿足訪問條件 cur從棧頂元素右子樹出發 繼續進行1,2
4.2 **實現
public
void
posorder
(treenode root)
stack
stack=
newstack
<
>()
; treenode cur=root;
//pre用來記錄上乙個被訪問過的節點 初始情況下沒有任何節點被訪問過
treenode pre=null;
while
(true
)//2.取棧頂元素看能不能訪問這個元素
//右子樹為空
//右子樹被訪問過
if(stack.
isempty()
) treenode top=stack.
peek()
;//只是取元素判斷 不能出棧
if(top.right==null||top.right==pre)
else
}}
至此 , 模組性的介紹二叉樹這種資料結構的相關部落格就已經基本告一段落 , 之後的練習中會繼續更新相關的經典題型的~ 保安日記之二叉樹高階面試題 上
一 前言 關於二叉樹的的基本操作以及初階的面試題在前面的部落格已經介紹完畢,這篇部落格用二叉樹這種資料結構來解決一些更加複雜的程式設計問題 二 二叉樹的層序遍歷 2.1 題目 給你乙個二叉樹,請你返回其按 層序遍歷 得到的節點值 即逐層地,從左到右訪問所有節點 示例 二叉樹 3,9,20,null,...
二叉樹面試題
1.求二叉樹節點個數 可以使用遞迴解決。將問題分解為求根節點 左子樹的節點數 右節點的節點數。實現 public size t size private size t size node root 2.求頁節點個數 頁節點 左右子樹都為空的節點被稱為頁節點,使用遞迴遍歷,當碰到乙個左右子樹為空的節點...
面試題 二叉樹
面試題 二叉樹 1.重建二叉樹 前序 中序 treenode reconstructbinarytree vector pre,vector vin treenode root new treenode pre 0 int pos 0 for pos pre left,vin left,pre ri...