輸入乙個二叉樹和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。
如上圖的二叉樹,當輸入根結點和乙個數值12的時候,就有兩條路徑「1->2->4->5」和「1->3->8」,如果存在,就輸出上述路徑,如果沒有任何一條路徑滿足就不輸出路徑並提示;
首先,路徑一定是從根結點開始到某個葉子結點結束,這才是一條路徑,因此,應該最先訪問的就是根結點,而在二叉樹的先中後序遍歷中只有先序遍歷是最先訪根結點的,所以可以用如下方法:用先序遍歷方法遍歷二叉樹,每當經過乙個結點的時候就將其值進行儲存相加,如果中途發現或者到達葉子結點之後,當前路徑相加得到的值並不滿足要求的值,則往回退並將值減去,或者當前路徑已經滿足,則需要再去換一條路徑訪問看是否還有其他路徑滿足條件,而能夠提供往回退的方法就只有遞迴了,直至遍歷完畢二叉樹;
程式設計如下:
#include #include #include using namespace std;struct binarytreenode//二叉樹結點資料結構};binarytreenode* _create(int *arr, size_t& index, size_t size)//建立二叉樹 else return null;}binarytreenode* createbinarytree(int *arr, size_t size)void destorybinarytree(binarytreenode *root)//銷毀二叉樹}void prevorder(binarytreenode *root)//前序遍歷列印出二叉樹}void _count(binarytreenode* root, vector*pv, int& count, int num)int main(); int num = 12; binarytreenode *root = createbinarytree(arr, sizeof(arr)/sizeof(arr[0])); cout<
執行程式:
《完》本文出自 「敲完**好睡覺zzz」 部落格,請務必保留此出處
25 二叉樹中和為某一值的路徑
題目描述 輸入一顆二叉樹和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。典型的回溯法問題。void printpath binarytreenode root,int sum void getpath binarytree...
二叉樹中和為某一值的路徑
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...
二叉樹中和為某一值的路徑
要輸出所有的路徑,必須額外用乙個棧來儲存當前路徑資訊。當訪問到節點a時,節點a的資訊要在訪問a的左右子樹時用到,因而,該資訊必須在遍歷a的左右子樹前加入到棧中,而在遍歷完a的左右子樹後從棧中移除。每訪問乙個節點,就計算當前路徑值 可直接利用父節點的路徑值 當其等於給定值且當前節點是葉子節點時,就列印...