二叉樹與遞迴

2021-10-25 11:46:47 字數 1994 閱讀 3850

上圖是一顆二叉樹,二叉樹的特點是「二叉樹的每個節點的左右子樹也是一顆二叉樹」,需要特殊說明的是,「空」也是一顆二叉樹。

二叉樹可以拆分為多個小二叉樹,小二叉樹的性質和大二叉樹的性質完全一樣。這種性質和遞迴演算法很相似,遞迴演算法也是把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解。我們往往可以使用遞迴演算法求解二叉樹的一些問題。

給定乙個二叉樹,找出其最大深度。

二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。

說明: 葉子節點是指沒有子節點的節點。

示例:給定二叉樹 [3,9,20,null,null,15,7],

3/ \

9  20

/  \

15   7

返回它的最大深度 3 。

/**

* 二叉樹節點的定義

*/public class treenode

}

題目**模板

class solution 

}

使用遞迴演算法一般有兩個步驟

1、遞迴過程。

2、遞迴中止條件。

題目已經定義了求解二叉樹深度的函式maxdepth(treenode root)。遞迴過程應該是這樣,使用maxdepth函式求出左右子樹的深度,取左右子樹深度中最大的乙個並加上1,這便是當前節點的最大深度。

遞迴中止條件,當節點為null,返回0即可。

解題**

class solution 

// 左右子樹的深度

int leftdepth = maxdepth(root.left);

int rightdepth = maxdepth(root.right);

// 取左右子樹最大深度 + 1

return math.max(leftdepth, rightdepth) + 1;}}

leetcode第226道問題,翻轉二叉樹

翻轉一棵二叉樹。

示例:輸入:

4/   \

2     7

/ \   / \

1   3 6   9

輸出:4

/   \

7     2

/ \   / \

9   6 3   1

備註:這個問題是受到 max howell 的 原問題 啟發的 :

谷歌:我們90%的工程師使用您編寫的軟體(homebrew),但是您卻無法在面試時在白板上寫出翻轉二叉樹這道題,這太糟糕了。

/**

* 二叉樹節點的定義

*/public class treenode

}

題目**模板

class solution 

}

翻轉二叉樹的思路如下

很明顯,這也是乙個遞迴的思路。

解題**

class solution 

// 左子樹、右子樹對調

treenode temp = root.left;

root.left = root.right;

root.right = temp;

// 對左子樹、右子樹執行同樣的翻轉過程

inverttree(root.left);

inverttree(root.right);

return root;}}

二叉樹與遞迴

給中序遍歷和後續遍歷,求從根到葉子權值最小的路徑,的葉子節點的值。若有多條,求葉子最小的。include include include include using namespace std const intmaxn 10005 struct node intin maxn post maxn ...

二叉樹遞迴

我們來看一下二分搜尋樹的釋放,這就是乙個典型的遞迴問題 function destroy node 這個遞迴包括兩個部分,乙個是遞迴終止條件,乙個是遞迴的執行。我們知道遞迴是不斷地將當前函式壓入函式棧,如果沒有if node null return這個終止條件,當函式棧被壓滿之後就會發生棧溢位 棧的...

遞迴二叉樹

1 基本概念 1 節點 結點包含資料和指向其它節點的指標。2 根節點 樹第乙個結點稱為根節點。3 結點的度 結點擁有的子節點個數。4 葉節點 沒有子節點的節點 度為0 5 父子節點 乙個節點father指向另乙個節點child,則child為孩子節點,father為父親節點。6 兄弟節點 具有相同父...