俊介三

一天更新一点,一天积累一点

导航

在二元树中找出和为某一值的所有路径

Posted on 2013-03-27 20:53  俊介三在前进  阅读(118)  评论(0编辑  收藏  举报

题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如 输入整数22和如下二元树
  10 
  /   \  
 5    12  
 / \  
4   7
则打印出两条路径:10, 12和10, 5, 7。

这个问题最近做得烂透了。
思路:把需要带到叶子的中间结果作为参数放在递归函数里,每次往里加~(我再看看别人又是如何写的。。)

我的代码:

#include <iostream>
#include <stdlib.h>
#include <stack>
#include <queue>

using namespace std;

struct Node{
    int data;
    Node* left;
    Node* right;
    Node(){}
    Node(int d){
        data = d;
        left = NULL;
        right = NULL;
    }
};

//所要找的和
int limit;

//acc表示累计和
//myv保存路径
void find(Node* node, int acc, vector<int> myv){
    if(node==NULL) return;
    acc += node->data;
    if(acc>limit) return;
    myv.push_back(node->data);
    if(acc==limit && node->left==NULL && node->right==NULL){
        vector<int>::iterator it;
        for(it=myv.begin();it!=myv.end();it++){
            printf("%d ",*it);
        }
        puts("");
        return;
    }
    find(node->left,acc,myv);
    find(node->right,acc,myv);
}


int main(){
    Node* root = new Node(1);
    Node* n1 = new Node(2);
    Node* n2 = new Node(3);
    Node* n3 = new Node(4);
    Node* n4 = new Node(5);
    Node* n5 = new Node(6);
    Node* n6 = new Node(7);
    Node* n7 = new Node(8);
    root->left = n1;
    root->right = n2;
    n1->left = n3;
    n1->right = n4;
    n2->left = n5;
    n2->right = n6;
    n3->left = n7;
    
    limit = 15;// 8/9/10 为测试数据
    vector<int> myv;
    find(root,0,myv);
    return 0;
}