遞迴究竟有多強大,看看這道題就知道了。
通過這道題,你可以掌握
題目:輸入乙個整數和一棵二元樹。
從樹的【根結點】開始往下訪問一直到【葉結點】所經過的所有結點形成一條路徑。
列印出和與輸入整數相等的所有路徑。
例如,輸入20和如下二叉樹
列印出路徑 10 6 4 思路
對於子結點,我們會發現,要執行的操作跟我們上面三點一模一樣!這就是在暗示你,該使用遞迴啦!
在遍歷的時候,我們把乙個個結點壓入棧中。這就要求我們,在遍歷後要讓節點出棧,否則函式將永遠不能跳出來。
因此我們在函式退出之前要在路徑上刪除當前結點並減去當前結點的值,以確保返回父結點時路徑剛好是根結點到父結點的路徑。
源**
#include #include#include #include#include using namespace std;
/**在二叉樹中找出和為某一值的所有路徑
題目:輸入乙個整數和一棵二叉樹。
從樹的【根結點】開始往下訪問一直到【葉結點】所經過的所有結點形成一條路徑。
列印出和與輸入整數相等的所有路徑
思路當訪問到某一結點時,把該結點新增到路徑上,並累加當前結點的值。
如果當前結點為葉結點並且當前路徑的和剛好等於輸入的整數,則當前的路徑符合要求, 我
們把它列印出來。
如果當前結點不是葉結點, 則繼續訪問它的子結點。
因此我們在函式退出之前要在路徑上刪除當前結點並減去當前結點的值,
以確保返回父結點時路徑剛好是根結點到父結點的路徑。
我們不難看出儲存路徑的資料結構實際上是乙個棧結構,因為路徑要與遞迴呼叫狀態一致,
而遞迴呼叫本質就是乙個壓棧和出棧的過程。
*/struct binarytreenode // a node in the binary tree
;//求和等於某個值的路徑
void findpath(binarytreenode * node,int expectadd,vectorpath,int sum)
void main()
執行
對於遞迴,記住這麼一句話,遞迴呼叫本質就是乙個壓棧和出棧的過程
二叉樹中和為某一值的路徑 C
題目 輸入一顆二叉樹的根節點和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。思路 使用遞迴方法,從根節點出發,逐步向子節點遍歷,使用動態陣列儲存所經過的節點,並儲存每一步時當前的路徑節點之和,當到達葉節點時,該路徑上所有節...
二叉樹為某一值的路徑
題目 輸入一顆二叉樹的根節點和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。注意 在返回值的list中,陣列長度大的陣列靠前 思路 深度優先搜尋。使用前序遍歷,使用兩個全域性變數result和tmp,result來存放最終...
二叉樹中和為某一值的路徑
include include using namespace std struct node void find path node r,int exceptedsum,vector path,int cursum node buildbtree int a,int i void preorder...