目錄
3.後序遍歷(左-右-根)
2.中序遍歷(左-根-右)
1.先序遍歷(根-左-右)
二叉樹如圖:
無論我們用哪種順序遍歷二叉樹,都要明確下面幾點:
什麼時候入棧
什麼時候出棧
什麼時候列印
由於先序遍歷和中序遍歷比較簡單,就沒詳細說明,主要說下後序遍歷
先遍歷左子節點,後遍歷右子節點,最後是根節點,但右子節點不能直接獲取所以需要在棧中 儲存根節點。那麼根節點什麼時候出棧呢?根節點的右子節點全部遍歷完即可出棧。再看看具體思路。
根節點1入棧,然後把1的左子節點入棧,重複該過程。這時棧內資料1,2,4
4沒有左子節點,然後看沒有右子節點,所以4出棧列印,這時棧內資料1,2
2出棧,2的左子樹處理完畢,開始處理右子樹。2的右子節點存在,所以2這時不能出棧,把2放回去。這時棧內資料,1,2。然後繼續按一樣的方法處理2的右子樹。最終棧內資料1,2,5,7。
但這樣做有個問題,2再次出棧時,右子樹已經遍歷過了,那我怎麼避免再次遍歷右子樹?看出棧順序,2的右子節點5比2先出棧,所以我們只要記下lastnode就行,2出棧後和lastnode比較,一樣則說明2的右子節點已經遍歷過,只列印出棧節點值就行。
binarytreenode
currentnode
= tree;
system.out
.println();
system.out
.print(
"非遞迴中序遍歷:");
stack
stack
=new
stack<>();
binarytreenode
lastnode
=null;
while
(null
!= currentnode
|| stack
.isempty())
currentnode
= stack
.pop();
if
(null
== currentnode
.getrightnode() ||
lastnode
== currentnode
.getrightnode())else}
根節點入棧,有左子節點入棧,無左子節點列印該節點。然後出棧,列印出棧元素值。出棧左節點按最開始操作。
publicvoid
printmiddleorder(binarytreenode
tree)
currentnode
= stack
.pop();
system.out
.print(
currentnode
.getdata() +
", ");
currentnode
= currentnode
.getrightnode
(); }
} 先列印1,如果leftson存在,則列印leftson。如果leftson 2存在子節點則先列印2,然後處理2的leftson節點,如果2的leftson不存在則處理2的rightson。該過程需要儲存根節點以便找到rightson節點。
根節點列印完,進棧,然後指向左節點,左節點列印,進棧。
沒有左子節點了,這時候需要列印右子節點。但根節點已進棧,所以出棧(由於根節點列印過,直接處理右子節點)。列印右子節點。
publicvoid
printfirstorder(binarytreenode
tree)
currentnode
= stack
.pop();
currentnode
= currentnode
.getrightnode(); }
}
二叉樹的遍歷 二叉樹遍歷與儲存
在資料結構中,二叉樹是非常重要的結構。例如 資料庫中經常用到b 樹結構。那麼資料庫是如何去單個查詢或者範圍查詢?首先得理解二叉樹的幾種遍歷順序 先序 中序 後序 層次遍歷。先序 根節點 左子樹 右子樹 中序 左子樹 根節點 右子樹 後序 左子樹 右子樹 根節點 按層級 class node if c...
構建二叉樹 遍歷二叉樹
陣列法構建二叉樹 public class main public static void main string args 用陣列的方式構建二叉樹 public static void createbintree 把linkedlist集合轉成二叉樹的形式 for int j 0 j 最後乙個父節...
玩轉二叉樹(二叉樹的遍歷)
時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 給定一棵二叉樹的中序遍歷和前序遍歷,請你先將樹做個鏡面反轉,再輸出反轉後的層序遍歷的序列。所謂鏡面反轉,是指將所有非葉結點的左右孩子對換。這裡假設鍵值都是互不相等的正整數。輸入格式 ...