在二元树中找出和为某一值的所有路径
题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如输入整数22 和如下二元树
10
/ \
5 12
/ \
4 7
题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如输入整数22 和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12 和10, 5, 7。
#include <iostream>
#include <vector>
using namespace std;
class CTreeNode
{
public:
int m_data;
CTreeNode *m_pleft;
CTreeNode *m_pright;
CTreeNode(int data=0, CTreeNode *left=NULL, CTreeNode *right=NULL):m_data(data),m_pleft(left),m_pright(right){}
};
CTreeNode *Create() //创建二叉树
{
CTreeNode *pNode1 = new CTreeNode(4); //new
CTreeNode *pNode2 = new CTreeNode(7);
CTreeNode *pNode3 = new CTreeNode(5, pNode1, pNode2);
CTreeNode *pNode4 = new CTreeNode(12);
CTreeNode *pNode5 = new CTreeNode(10, pNode3, pNode4);
return pNode5;
}
void Search(CTreeNode *Root, int sum, int path[],int count)
{
path[count++] = Root->m_data; //从根开始记录路径和点之和
sum -= Root->m_data;
if(Root->m_pleft==NULL && Root->m_pright==NULL)
{
if(sum == 0)
{
int i=0;
for(i=0;i<count;i++)
cout<<path[i]<<endl;
}
return;
}
else
{
Search(Root->m_pleft, sum, path, count);
Search(Root->m_pright, sum, path, count);
}
count--; //回溯!!!!!!!!!
sum += Root->m_data;
}
int main()
{
CTreeNode *pRoot = Create();
int path[10];
int sum=22;
int count=0;
Search(pRoot, sum, path, count);
return 0;
}