您現在的位置是:首頁 > 動作武俠首頁動作武俠

程式設計設計師必備的基礎知識:程式設計中的二叉樹、陣列儲存、資料分析等

簡介3輸出當前節點   9->15->35->20->10下面程式碼演示:** * 前序遍歷 *public void preOrder(){輸出當前節點Sy

如何建立二叉樹

在程式設計世界中,樹其實是一種

非線性

的資料結構,相對於線性的資料結構(連結串列、陣列)而言,

樹的平均執行時間更短(往往與樹相關的排序時間複雜度都不會高)

在現實生活中,我們一般的樹長這個樣子的:

二叉樹基礎知識

但是在我們實際程式設計的世界中,我們一般把樹“倒”過來看,從根到開始讀起。如下圖所示:

二叉樹基礎知識

為什麼需要二叉樹這種資料結構

1、陣列儲存方式的分析

優點:透過下標方式訪問元素,速度快。對於有序陣列,還可使用二分查詢提 高檢索速度。

缺點:如果要插入值

(

按一定順序

)

會整體移動,效率較低

畫出操作示意圖:

二叉樹基礎知識

2、連結串列儲存方式的分析

優點:在一定程度上對陣列的儲存方式有最佳化(比如:插入一個數值節點,只需要將插入節點,連結到連結串列中就行了,刪除效率也不錯)

缺點:在進行檢索時,效率仍然較低,比如(檢索某個值,需要從頭節點開始遍歷)

操作示意圖:

二叉樹基礎知識

樹儲存方式的分析

能保證提高資料儲存,讀取的效率,比如利用二叉排序樹,即可以保證資料的檢索速度,同時也可以保證資料的插入,刪除,修改的速度。

案例

:

[7, 3, 10, 1, 5, 9, 12]

二叉樹基礎知識

樹的常用術語

二叉樹基礎知識

樹的常用術語(結合示意圖理解):1) 節點2)根節點3)父節點4)子節點5)葉子節點(沒有子節點的節點)6)節 點的權(節點值)7)路徑(從root節點找到該節點的路線)8)層9)子樹10)樹的高度(最大層數)

二叉樹是什麼

1)樹有很多種,每個節點最多隻能有兩個子節點的一種形式稱為二叉樹。

2)二叉樹的子節點分為左節點和右節點

3)示意圖

二叉樹基礎知識

4)如果該二叉樹的

所有葉子節點都在最後一層

並且結點總數=

2^n -1

, n 為層數,則我們稱為滿二叉樹。

二叉樹基礎知識

5)如果該二叉樹的所有葉子節點都在

最後一層或者倒數第二層

,而且

最後一層的葉子節點在左邊連續,倒數第二層的葉子節點在右邊連續

,我們稱為完全二叉樹。

二叉樹基礎知識

如何建立二叉樹

靜態建立二叉樹

由上面的知識瞭解到了二叉樹是由多個節點組成的,而節點與節點之間的連結就成了樹。

所以首先建立樹的過程是先建立多個節點。然後將節點與節點之間連線起來。下面是程式碼:

class TreeNode{ private int no;//資料 private TreeNode left; //左節點 private TreeNode right;//右節點 public int getNo() { return no; } public void setNo(int no) { this。no = no; } public TreeNode getLeft() { return left; } public void setLeft(TreeNode left) { this。left = left; } public TreeNode getRight() { return right; } public void setRight(TreeNode right) { this。right = right; }}

下面我們就拿這個二叉樹為例來構建吧:

二叉樹基礎知識

//根節點 TreeNode treeNode = new TreeNode(10); //左節點——>9 TreeNode treeNode2 = new TreeNode(9); //右節點——>20 TreeNode treeNode3 = new TreeNode(20); //20的左節點——>15 TreeNode treeNode4 = new TreeNode(15); //20的右節點——>35 TreeNode treeNode5 = new TreeNode(35); //根節點的左節點 treeNode。setLeft(treeNode2); //根節點的右節點 treeNode。setRight(treeNode3); //20節點的左節點 treeNode3。setLeft(treeNode4); //20節點的右節點 treeNode3。setRight(treeNode5);

二叉樹遍歷

使用前序,中序和後序對下面的二叉樹進行遍歷。

1) 前序遍歷: 先輸出父節點,再遍歷左子樹和右子樹

2) 中序遍歷: 先遍歷左子樹,再輸出父節點,再遍歷右子樹

3) 後序遍歷: 先遍歷左子樹,再遍歷右子樹,最後輸出父節點

4) 小結:

看輸出父節點的順序,就確定是前序,中序還是後序

以上圖的二叉樹為例:

分析二叉樹的前序,中序,後序的遍歷步驟1。建立一顆二叉樹2。 前序遍歷2。1先輸出當前節點(初始的時候是root節點)2。2如果左子節點不為空,則遞迴繼續前序遍歷2。2如果右子節點不為空,則遞迴繼續前序遍歷 10->9->20->15->353。中序遍歷3。1如果當前節點的左子節點不為空,則遞迴中序遍歷,3。2輸出當前節點3。2如果當前節點的右子節點不為空,則遞迴中序遍歷 9->10->15->20->354。後序遍歷3。1如果當前節點的左子節點不為空,則遞迴後序遍歷,3。2如果當前節點的右子節點不為空,則遞迴後序遍歷3。3輸出當前節點   9->15->35->20->10

下面程式碼演示:

/** * 前序遍歷 */ public void preOrder(){ //輸出當前節點 System。out。println(this); //遞歸向左子樹前序遍歷 if(this。left!=null){ this。left。preOrder(); } //遞歸向右子樹前序遍歷 if(this。right!=null){ this。right。preOrder(); } } /** * 中序遍歷 */ public void indexOrder(){ //遞歸向左子樹前序遍歷 if(this。left!=null){ this。left。indexOrder(); } //輸出當前節點 System。out。println(this); //遞歸向右子樹前序遍歷 if(this。right!=null){ this。right。indexOrder(); } } /** * 後序遍歷 */ public void postOrder(){ //遞歸向左子樹前序遍歷 if(this。left!=null){ this。left。postOrder(); } //遞歸向右子樹前序遍歷 if(this。right!=null){ this。right。postOrder(); } //輸出當前節點 System。out。println(this); }

最後結果

二叉樹基礎知識

二叉樹-查詢指定節點

要求

1) 請編寫前序查詢,中序查詢和後序查詢的方法。

2) 並分別使用三種查詢方式,查詢 value = 15 的節點

3) 並分析各種查詢方式,分別比較了多少次

4) 思路分析圖解

二叉樹基礎知識

使用前序,中序,後序的方式來查詢指定的結點

前序查詢思路

1。先判斷當前結點的no是否等於要查詢的

2。如果是相等,則返回當前結點

3。如果不等,

則判斷當前結點的左子節點是否為空

,如果不為空,則遞迴前序查詢

4。如果左遞迴前序查詢,找到結點,則返回,否繼續判斷,當前的結點的右子節點是否為空,如果不空,則繼續向右遞迴前序查詢。

中序查詢思路

1。 判斷當前結點的左子節點是否為空,如果不為空,則遞迴中序查詢

2。如果找到,則返回,如果沒有找到,就和當前結點比較,如果是則返回當前結點,否則繼續進行右遞迴的中序查詢

3。如果右遞迴中序查詢,找到就返回,否則返回null

後序查詢思路

1。判斷當前結點的左子節點是否為空,如果不為空,則遞迴後序查詢

2。如果找到,就返回,如果沒有找到,就判斷當前結點的右子節點是否為空,如果不為空,則右遞迴進行後序查詢,如果找到,就返回

3。就和當前結點進行,比如,如果是則返回,否則返回null

歡迎大家關注我的公眾號:java學習之路,長期分享各種技術文章

Top