二叉樹的三種遍歷方式,含demo(遞迴與非遞迴)

2021-10-21 10:35:18 字數 3050 閱讀 8684

什麼是二叉樹:乙個遞迴的樹形資料結構,每個節點最多有兩個子節點;二叉樹一般都是二分查詢樹,每個節點的值大於它左子節點的值,小於它右子節點的值

遞迴遍歷:

前序遍歷:先訪問根節點,再訪問左子節點,最後訪問右子節點

上圖中前序遍歷結果:30、20、5、28、50、38、58

中序遍歷:先訪問左子節點,再訪問根節點,最後訪問右子節點

上圖中中序遍歷結果:5、20、28、30、38、50、58

後序遍歷:先訪問左子節點,再訪問右子節點,最後訪問根節點

上圖中後序遍歷結果:5、28、20、38、58、50、30

非遞迴遍歷:

常用的是利用棧的先進後出特性,不斷地將節點入棧,然後再出棧

非遞迴前序遍歷非遞迴中序遍歷兩種方式很好理解,控制遍歷時機即可,而非遞迴後序遍歷較為複雜,需要額外維護乙個最後訪問節點

二叉樹demo詳細實現原理都在注釋中,花了幾天寫的,球球你好好看看,來都來了

public class mybinarytree

else

if(value > current.value)

else

return current;

} public void addnode

(int value)

private boolean iscontainnode

(mynode current, int value)

public boolean iscontainnode

(int value)

//刪除節點比較複雜,或許會讓你看了以後瘋狂懷疑自己,請酌情檢視

private mynode deletenode

(mynode current, int value)

else

if(current.value > value)

else

} public boolean deletenode

(int value)

//中序遞迴遍歷

private void centershow

(mynode root)

} public void centershow()

public void centershowpro()

//取出棧頂元素作為根節點並刪除棧頂元素,此時棧頂元素為最左節點的值

root = nodestack.

pop();

//遍歷左節點,因為是從根往左入棧,所以出棧是從左到根

system.out.

print

(root.value +

" ")

;//找到下乙個節點,依次往右遍歷

root = root.right;}}

private void preshow

(mynode root)

} public void preshow()

public void preshowpro()

root = nodestack.

pop();

root = root.right;}}

private void aftershow

(mynode root)

} public void aftershow()

public void aftershowpro()

//取出棧頂元素但不刪除

root = nodestack.

peek()

;//如果棧頂元素的右節點為空或者它是最後一次訪問的節點

if(root.right ==

null

|| root.right == lastnode)

else}}

private int findsmallernode

(mynode root)

//節點,為了演示方便,只支援存放int數字

private class mynode

}}

測試:

public class mybinarytest

public static void deletetest()

public static void testcenter()

public static void testcenterpro()

public static void testpre()

public static void testprepro()

public static void testafter()

public static void testafterpro()

}

執行結果:

是否存在28:true

刪除28後是否還存在28:false

先序遞迴遍歷:30205

2850

3858

先序非遞迴遍歷:30205

2850

3858

中序遞迴遍歷:5

2028

3038

5058

中序非遞迴遍歷:5

2028

3038

5058

後序遞迴遍歷:5

2820

3858

5030

後序非遞迴遍歷:5

2820

3858

5030

還是那句話,家裡有條件的一定一定一定複製到idea跑一跑ok我話說完,skr~

二叉樹三種遍歷方式

三種遍歷方式是按照根節點的訪問順序來定義的 1 前序遍歷 先訪問根結點 然後遍歷左子樹,最後遍歷右子樹 並且,在遍歷左 右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。根左右 2 中序遍歷 先遍歷左子樹 然後訪問根結點,最後遍歷右子樹 並且,在遍歷左 右子樹時,仍然先遍歷左子樹,然後訪問...

重建二叉樹 遍歷二叉樹的三種方式

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。示例 前序遍歷 preorder 3,9,20,15,7 中序遍歷 inorder 9,3,15,20,7 返回如下的二叉樹 3 9 20 15 7限制 0 節點個數 5000 這個題的解法...

二叉樹的三種遍歷方式總結

最近學了二叉樹的三種遍歷方式,即前序遍歷,中序遍歷,後序遍歷三種,仔細思索後,在此簡單總結一下。一.二叉樹示意圖 假設有一顆二叉樹如下 二.遍歷分析 每一顆二叉樹由根節點,左子樹,右子樹三個部分組成,規定先遍歷左子樹,再遍歷右子樹,這樣一來就有了三種遍歷方式,按照遍歷根節點的先後順序來劃分,根 左 ...