二叉樹的遍歷方式(遞迴 非遞迴) Java實現

2021-08-28 02:19:40 字數 2529 閱讀 1821

二叉樹作為一種常用的資料結構,也是面試經常被問到的知識點,了解二叉樹的結構和性質也是很有必要的,對於眾多的樹結構,二叉樹只是入門的一種,先把二叉樹理解通透,再深入學習時,會更簡單一些。

二叉樹的性質:

(1) 在非空二叉樹中,第i層的結點總數不超過(2) 深度為h的二叉樹最多有

個結點(h>=1),最少有h個結點;

(3) 對於任意一棵二叉樹,如果其葉結點數為n0,而度數為2的結點總數為n2,則n0=n2+1;

(4) 具有n個結點的完全二叉樹的深度為

(5)有n個結點的完全二叉樹各結點如果用順序方式儲存,則結點之間有如下關係:

若i為結點編號則 如果i>1,則其父結點的編號為i/2;

如果2*i<=n,則其左孩子(即左子樹的根結點)的編號為2*i;若2*i>n,則無左孩子;

如果2*i+1<=n,則其右孩子的結點編號為2*i+1;若2*i+1>n,則無右孩子。

(6)給定n個節點,能構成h(n)種不同的二叉樹。

h(n)為卡特蘭數的第n項。h(n)=c(2*n,n)/(n+1)。

(7)設有i個枝點,i為所有枝點的道路長度總和,j為葉的道路長度總和j=i+2i 

樹的結點(node):包含乙個資料元素及若干指向子樹的分支;

孩子結點(child node):結點的子樹的根稱為該結點的孩子;

雙親結點:b 結點是a 結點的孩子,則a結點是b 結點的雙親;

兄弟結點:同一雙親的孩子結點; 堂兄結點:同一層上結點;

祖先結點: 從根到該結點的所經分支上的所有結點子孫結點:以某結點為根的子樹中任一結點都稱為該結點的子孫結點層:根結點的層定義為1;根的孩子為第二層結點,依此類推;

樹的深度:樹中最大的結點層

結點的度:結點子樹的個數

樹的度: 樹中最大的結點度。

葉子結點:也叫終端結點,是度為 0 的結點;

分枝結點:度不為0的結點;

有序樹:子樹有序的樹,如:家族樹;

無序樹:不考慮子樹的順序;

1.前序遍歷:對於下圖二叉樹的前序遍歷結果為:1  2  4  8  9  5  10  3  6  72.中序遍歷:對於下圖二叉樹的中序遍歷結果為:8  4  9  2  10  5  1  6  3  73.後序遍歷:對於下圖二叉樹的後 序遍歷結果為:8  9  4  10  5  2  6  7  3  1

一、前序遍歷

基本思想:先訪問根結點,再先序遍歷左子樹,最後再先序遍歷右子樹。

**實現:

遞迴方法

/**

public class treenode }*/

private void preorderbintree(treenode root)

非遞迴,用棧實現

private void preiteratebintree(treenode root)  else }}

二、中序遍歷

基本思想:先中序遍歷左子樹,然後再訪問根結點,最後再中序遍歷右子樹即左—根—右

遞迴方法

private void inorderbintree(treenode root)
非遞迴,用棧實現

private void initeratebintree(treenode root)  else }}

三、後序遍歷

基本思想:先後序遍歷左子樹,然後再後序遍歷右子樹,最後再訪問根結點即 左—右—根。

遞迴實現

private void afterorderbintree(treenode root)
非遞迴,棧實現

private void afteriteratebintree(treenode root) 

while(!stack1.empty() && stack2.peek() == i)

if(!stack1.empty())}}

四、層次遍歷

非遞,佇列歸實現

private void layeriteratebintree(treenode root)  else }}

二叉樹的遍歷方式(遞迴 非遞迴)

二叉樹的前序 中序 後序遍歷方式,遞迴與非遞迴。層序遍歷的方式已經在之前的部落格中寫過 遞迴方式比較簡單。前序遍歷 void preorder treenode root 前序遍歷非遞迴 基本思路 利用棧。先輸出結點值,再入棧。然後遍歷左子樹。退棧時,遍歷棧頂結點的右子樹。void preorder...

二叉樹遍歷(遞迴 非遞迴)

二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...

二叉樹的遍歷 非遞迴方式

分別用非遞迴的方式實現二叉樹的先序遍歷 中序遍歷和後續遍歷 非遞迴方式實現二叉樹的先序遍歷。過程 1.申請乙個新的棧,記為stack,然後將二叉樹的頭結點head壓入stack中。2.從stack中彈出棧頂結點,記為cur,然後列印cur結點的值,再將結點cur的右孩子 不為空的話 先壓入stack...