C 之回溯演算法解決二叉樹的路徑問題

2021-10-07 20:52:37 字數 1890 閱讀 2684

之前我們寫過c++之回溯演算法解決子集、全排列和組合問題,二叉樹的路徑問題,其實也是屬於排列組合問題,今天就以leetcode上的真題來使用回溯演算法解決二叉樹的路徑問題:

在此之前需要注意乙個問題:回溯演算法算是dfs的一種特例,區別就是回溯演算法在求解過程中不保留完整的樹結構(因為回溯了),但是dfs則記下完整的搜尋樹。例如之前寫的幾篇文章,大家可以對比一下回溯演算法和dfs的結果c++之圖的深度優先遍歷(dfs)、c++之力扣22. 括號生成(dfs)、c++之力扣17. **號碼的字母組合(dfs+bfs)

leetcode112. 路徑總和

給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。

/**

* definition for a binary tree node.

* struct treenode

* };

*/class

solution

//回溯第二步,遞迴

dfs(root-

>left, sum)

;dfs

(root-

>right, sum)

; res -

= root-

>val;

// 回溯第三步}}

bool

haspathsum

(treenode* root,

int sum)

};

leetcode257. 二叉樹的所有路徑

給定乙個二叉樹,返回所有從根節點到葉子節點的路徑。

/**

* definition for a binary tree node.

* struct treenode

* };

*/class

solution

vector

binarytreepaths

(treenode* root)

};

leetcode1372. 二叉樹中的最長交錯路徑

給你一棵以 root 為根的二叉樹,二叉樹中的交錯路徑定義如下:

1、選擇二叉樹中 任意 節點和乙個方向(左或者右)。

2、如果前進方向為右,那麼移動到當前節點的的右子節點,否則移動到它的左子節點。

3、改變前進方向:左變右或者右變左。

4、重複第二步和第三步,直到你在樹中無法繼續移動。

交錯路徑的長度定義為:訪問過的節點數目 - 1(單個節點的路徑長度為 0 )。

請你返回給定樹中最長 交錯路徑 的長度。

/**

* definition for a binary tree node.

* struct treenode

* };

*/class

solution

else

}public

:int

longestzigzag

(treenode* root)

};

這裡再貼一道困難題,基於遞迴實現:

leetcode124. 二叉樹中的最大路徑和

給定乙個非空二叉樹,返回其最大路徑和。

本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含乙個節點,且不一定經過根節點。

/**

* definition for a binary tree node.

* struct treenode

* };

*/class

solution

intmaxpathsum

(treenode* root)

};

演算法 二叉樹路徑問題

二叉樹的路徑問題一般可以用dfs搜尋來解決,遞迴的思想一定要理解 注重最後一步和終止條件 public boolean haspathsum treenode root,int sum sum root.val if sum 0 root.left null root.right null 找一下左...

二叉樹 路徑

二叉樹中,從根節點到葉節點的每一條連線,我們稱之為路徑,最短路徑和最長路徑在之前的部落格中,我們已經完成了對他們的討論,現在我們討論一下,輸出一棵二叉樹中全部的路徑資訊。如下所示 public class operation childbinarytreepath root,return resul...

回溯 二叉樹求和的所有路徑

二叉樹求和的所有路徑,比如 例如 輸入整數22和如下二元樹 10 5 12 4 7 則列印出兩條路徑 10,12和12,5,7 include include include using namespace std static int sum 0 static int count 0 templa...