關於樹的演算法的總結

2021-06-25 20:23:28 字數 1609 閱讀 5921

之前總結過,主要分為兩大類:

一種是基於遍歷的,演算法框架就是前序遍歷,只是在訪問結點時候的操作不同。一般操作的都是全域性變數,靠side effect,沒有返回值。

一種是基於傳統遞迴思想的,先求左右子樹的解(子問題的解),然後基於左右子樹的解計算當前樹的解。這種函式有返回值。

其實還有第三種,就是以上二者的結合,既有返回值,又操作全域性資料。基於第二種演算法,不同之處在於左右子樹的解除了被用於計算當前樹的解之外,還可以額外利用,進行一些判斷,更新一些全域性變數。

比如判斷一棵樹是否平衡,需要求樹的高度,而樹的高度是乙個遞迴函式,h(root) = max(h(root->left), h(root->hight))+1, 自底向上的過程中求過每一棵子樹的左右子樹的高度,就可以判斷子樹是否平衡,如果任意一處子樹不平衡,就可以設定全域性變數,得到結果。這個函式的框架就是乙個求高度的遞迴函式,多了2個操作:

1)判斷兩棵子樹的高度差是否大於1,如果大於,設定全域性變數。

2)提前終止遞迴,如果求左子樹的過程中已經設定了全域性變數為false, 那麼就沒必要繼續求右子樹了。

當然,有時候可以把這個全域性變數和函式返回值融合到一起,比如求高度,正常總是非負的,就可以用乙個負數表徵全域性變數代表的意思。這時候這個求高度的遞迴函式定義是:如果樹是平衡的,返回樹的高度,否則返回-1。

還有乙個例子,求樹中一般路徑(任意兩點之間)最大和,普通路徑(從一點往下的路徑,不會跨越根結點到另一邊)最大和的遞推式是 f(root)= max(f(root->left),f(root-right)) >0 ? max(f(root->left),f(root->right)): 0 + root->val。演算法的框架就是這個,只是加進去一般路徑和的計算,然後和全域性變數maxpathsum 比較,並儲存。

返回值是復合含義的函式。

一般來講,函式的返回值的含義是單一的,不會有多種解讀。但有的函式返回值可以有多重含義。經典的lca就是個例子。定義乙個函式,f(root, a, b),如果 root是 a, b之一,返回root,如果a, b均不在根為root的樹里,返回null,否則返回a, b的最近公共祖先。遞推關係是:

1)如果 f(root->left, a, b) 和 f(root->right, a, b) 都為null,返回null

2)  如果 f(root->left, a, b) 和 f(root->right, a, b) 都不為null, 那麼這兩個返回值均為第乙個含義(root 為 a, b之一),lca必然為root, 返回root

3)  如果 f(root->left, a, b) 和 f(root->right, a, b) 其中乙個為null, 那麼另乙個返回值的含義就是最近公共祖先,返回這乙個值。

判斷樹是否平衡也是,可以定義乙個復合含義返回值的遞迴函式,balancedhight(root), 如果這棵樹平衡,返回其高度。否則返回-1。

九章演算法後的更新:

第三種模式(即依賴返回值,又操作全域性變數)可以歸併到第二種模式。通過定義乙個復合的返回型別result,把需要的子問題的資訊打包返回。比如isbst問題,需要左右子樹上的資訊包括,1)是否是bst 2) 最小值、最大值。可以把這三項資料定義乙個型別來返回資料。再比如isbalanced問題,定義返回資料報括,1)子樹是否平衡,2)子樹高度,當前樹根據左右子樹上的這兩個資訊就可以做判斷。

關於A 演算法的研究總結

重要公式 f n g n h n f n g n h n f n g n h n 其中 a 演算法在運算過程中,每次從優先佇列中選取f n 值最小 優先順序最高 的節點作為下乙個待遍歷的節點。另外,a 演算法使用兩個集合來表示待遍歷的節點,與已經遍歷過的節點,這通常稱之為open set和close...

關於樹的常見演算法實現

樹是資料結構中常用的結構,對於這方面寫關於自己的小的見解,理解,演算法實現包括,1 遞迴建立一棵樹 2 非遞迴 前序,中序遍歷一棵樹 3 遞迴 前序,中序,後續 遍歷一棵樹 4 給定節點的名字,找出節點在樹中的層次,或者說對應節點在樹的深度 5 根據給定的節點,找出它的所有兄弟,包括它的各種堂兄弟,...

關於Leetcode上二叉樹的演算法總結

二叉樹,結構很簡單,只是比單鏈表複雜了那麼一丟丟而已。我們先來看看它們結點上的差異 單鏈表的結構 struct singlelist 二叉樹的結構 struct binarytree 根據以上兩個結構,我們不難發現,單鏈表的結點只有乙個指向下一結點的指標,而二叉樹中有兩個。也就是說單鏈表每個結點只有...