我們來看一下二分搜尋樹的釋放,這就是乙個典型的遞迴問題
function
destroy
(node)
這個遞迴包括兩個部分,乙個是遞迴終止條件,乙個是遞迴的執行。我們知道遞迴是不斷地將當前函式壓入函式棧,如果沒有if(node == null) return
這個終止條件,當函式棧被壓滿之後就會發生棧溢位(棧的length是有限的)。
當我們要求二叉樹的最大深度,用遞迴很容易能解決這一問題。
function
maxdepth
(root)
當節點為空的時候return,假設我們有只有根節點和右子節點,那麼左子節點為空,我們得到的就是右子節點的depth + 1。
那麼如果我們要求二叉樹的最小深度呢,二叉樹的最小深度為根節點到最近葉子節點的距離。(如果根節點的左子樹為空,那麼最小深度要到右子樹中找)
function
mindepth
(root)
function
getmin
(root)
利用遞迴來反轉二叉樹非常容易
function
inverttree
(root)
來看這樣乙個問題,給出乙個二叉樹(每個節點的val上存放乙個數字)以及乙個數字sum,判斷在這棵二叉樹上是否存在一條從根到葉子的路徑,其路徑上的所有節點和為sum
function
haspathsum
(root, sum)
注意,這裡當sum等於根節點的val的時候,假如左子樹為空,那麼此時sum為0,返回了true,但是並不符合題目要求,因為要求是判斷是否存在一條從根節點到葉子節點的路徑。
function
haspathsum
(root, sum)
來看這樣乙個問題,給出乙個二叉樹,返回所有表示從根節點到葉子節點路徑的字串,結果示例為[『1->2->5』, 『1->3』]
我們來分析一下,這個問題實際上是根節點-> + 根節點->
function
binarytreepaths
(root)
var lefts = binarytreepaths(root.left);
for(var i = 0; i < lefts.length; i++)
var rights = binarytreepaths(root.right);
for(var i = 0; i < rights.length; i++)
return res;
}
遞迴二叉樹
1 基本概念 1 節點 結點包含資料和指向其它節點的指標。2 根節點 樹第乙個結點稱為根節點。3 結點的度 結點擁有的子節點個數。4 葉節點 沒有子節點的節點 度為0 5 父子節點 乙個節點father指向另乙個節點child,則child為孩子節點,father為父親節點。6 兄弟節點 具有相同父...
二叉樹 遞迴
完全二叉樹 只有最後一層不滿,其餘節點都有兩個孩子,並且最後一層的節點從左向右排列,如下圖 擴充二叉樹 每個實節點都有兩個孩子,如圖 類似dfs cout data preorder recursion bt leftchild preorder recursion bt rightchild vo...
二叉樹 遞迴 非遞迴
include include include include using namespace std typedef struct node bintree typedef struct node1 btnode void creatbintree char s,bintree root 建立二叉...