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

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

思路:

1、当访问到某一节点时,把该结点的值添加到当前和变量,且把该结点压入栈中。

2、若结点为叶子结点,且当前和变量==期望的和,则打印栈中的结点值,即为所需的路径。

3、若结点不是叶子结点,继续访问它的左孩子结点,访问它的右孩子结点。

4、删除该结点。包括从当前和变量中减去结点值,从栈中弹出结点值。此时,已回到父结点。

程序中的栈,利用STL中的vector,这样简化了编码工作。

#include <iostream>
#include <vector>
using namespace std;

struct BinaryTreeNode
{
    int m_value;
    BinaryTreeNode* m_pLeft;
    BinaryTreeNode* m_pRight;
};

vector<BinaryTreeNode *> path;
void CreateTree(BinaryTreeNode* &root, int* a, int i, int len)
{
    if (i>=len)
    {
        return;
    }
    root=new BinaryTreeNode;
    root->m_value=a[i];
    root->m_pLeft=NULL;
    root->m_pRight=NULL;
    CreateTree(root->m_pLeft,a,2*i+1,len);
    CreateTree(root->m_pRight,a,2*i+2,len);
}
void PreOrder(BinaryTreeNode* &root)
{
    if (!root)
    {
        return;
    }
    cout<<root->m_value<<"  ";
    PreOrder(root->m_pLeft);
    PreOrder(root->m_pRight);
}
void PrintPath(vector<BinaryTreeNode*> &pathvector)
{
    for (vector<BinaryTreeNode*>::iterator iter=pathvector.begin();iter!=pathvector.end();iter++)
    {
        cout<<(*iter)->m_value<<"  ";
    }
    cout<<endl;
}
void PathTree(BinaryTreeNode* &root, int val)
{
    static int sum=0;
    sum+=root->m_value;
    path.push_back(root);
    if (sum==val&&root->m_pLeft==NULL&&root->m_pRight==NULL)
    {
        PrintPath(path);
    }
    if (root->m_pLeft)
    {
        PathTree(root->m_pLeft,val);
    }
    if (root->m_pRight)
    {
        PathTree(root->m_pRight,val);
    }
    sum -= root->m_value;
    path.pop_back();
}
void main()
{
    BinaryTreeNode* root=0;
    int a[]={10,5,12,7,8};
    int len = sizeof(a)/sizeof(a[0]);
    CreateTree(root,a,0,len);
    PathTree(root,22);
}

 

posted @ 2012-12-29 13:54  lscheng  阅读(223)  评论(0编辑  收藏  举报