遞迴方式
遞迴方式的求解過程很簡單,只需要將問題分解。
首先,遞迴出口是什麼?毫無疑問,當樹節點為空時,我們就可以結束遞迴了。
那麼當前樹的高度和其左子樹及右子樹的關係是什麼呢?樹的高度,定義為從根節點到葉子節點的最長路徑;因此當前樹深應該是自身節點所佔的一層高度加上左右子樹中深的高度。
因此,有一下遞迴方式求解演算法。
/*******************
* 遞迴求解二叉樹的深度
* @param root 二叉樹的根節點
* @return 二叉樹的深度
*/public
static
intgettreedepthbyrecu
(treenode root)
//並不是空樹
int leftdepth=
gettreedepthbyrecu
(root.left)
;//遞迴求解左子樹深度
int rightdepth=
gettreedepthbyrecu
(root.right)
;//當前樹的深度就是左右子樹深度大的那乙個深度 加上節點本身的深度
return leftdepth>rightdepth?leftdepth+
1:rightdepth+1;
}
非遞迴方式
在二叉樹的遍歷時,我們提到過一種層次遍歷的方式,這種方式分層按照一層一層的方式讀取節點,如果我們能將這個過程中讀取了多少層記錄下來,那麼,也可以得到樹的深度。
二叉樹的遍歷
/************************
* 非遞迴求解樹的深度
* @param root 二叉樹的根節點
* @return 二叉樹的深度
*/public
static
intgettreedepth
(treenode root)
//使用層次遍歷的方式 遍歷整棵樹 求解樹的深度
//初始化
int treehigh=0;
// 樹高
int nextcount=1;
//還未進行遍歷的下一層的節點數
int count=0;
//當前層中已經遍歷的節點數
linkedlist
queue=
newlinkedlist
<
>()
;//linklist實現了queue介面 可以當做佇列使用
//將根節點加入佇列中
queue.
add(root)
;while
(!queue.
isempty()
)//佇列非空未遍歷完成
//一次迴圈遍歷即為查詢乙個節點
if(node.right!=null)
//當前遍歷的節點數和當前層的節點數相等時
//即一層的節點遍歷完成
if(count==nextcount)
}return treehigh;
}
二叉樹深度求解(遞迴,非遞迴)
遞迴實現基本思想 為了求得樹的深度,可以先求左右子樹的深度,取二者較大者加1即是樹的深度,遞迴返回的條件是若節點為空,返回0 演算法 1 intfindtreedeep bintree bt 8return deep 9 非遞迴實現基本思想 受後續遍歷二叉樹思想的啟發,想到可以利用後續遍歷的方法來求...
二叉樹 遞迴 非遞迴
include include include include using namespace std typedef struct node bintree typedef struct node1 btnode void creatbintree char s,bintree root 建立二叉...
求解二叉樹寬度的遞迴與非遞迴演算法
方法1 關於遞迴演算法的實現,遞迴演算法的實現包含兩個函式,在這個函式中需要借助陣列來實現實現的具體方式,是在迴圈遍歷的過程中,將每一層中的節點數都儲存到相應的陣列空間中。在對二叉樹進行遍歷結束後,在對陣列進行處理,便可以獲得,相應的二叉樹的寬度。將二叉樹中每層的結點數記錄在乙個陣列中,a i 的值...