1. 程式人生 > >【31】給定一個二叉樹打印出所有從根結點到葉子結點路徑和為 k 的路徑

【31】給定一個二叉樹打印出所有從根結點到葉子結點路徑和為 k 的路徑

題目:給定一個二叉樹要求打印出所有從根結點到葉子結點路徑和為value的路徑

          例如,給定二叉樹如下要求打印出所有和為9的路徑,有1->6->3->-1和1->7->4->-3

分析:

1. 要找到所有的路徑,利用前序遍歷即可做到,我們維護一個數組儲存路徑上面的點,同時維護一個sum,當到達葉子結點的時候判斷是否相等即可

2. 程式碼

//二叉樹結點
struct BinaryTreeNode{
    int value;
    BinaryTreeNode *lson;
    BinaryTreeNode *rson;
}; 

//列印路徑
void Print(int *path, int n){
    for(int i = 0; i < n; i++){
        cout<<path[i]<<" "; 
    }
    cout<<endl; 
} 

//列印和為k的所有路徑
void PrintPath(BinaryTreeNode *root, int *path, int pos, int sum, int k){
    //不合法資料 
	if(path == NULL){
	    return;
    }
	//到底葉子結點 
	if(root == NULL){
	    //和為value就列印 
		if(sum == k){
            Print(path, pos);
        }
    }
    path[pos] = root->value;
    PrintPath(root->lson, path, pos+1, sum+root->value, k);
    PrintPath(root->rson, path, pos+1, sum+root->value, k);
}