题目:
在二元树中找出和为某一值的所有路径
题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如 输入整数22和如下二元树
10
/ \
5 12
/ \
4 7
则路径分别为 10 12与 10 5 7
思路:DFS,分别对左右子树进行深搜,适当的进行剪枝,当某条路径不行时,应在路径数组中删除该子树根节点。
代码实现如下:
#include <iostream>
using namespace std;
int path[100],top=-1;
struct BinarySearchTreeNode
{
int data;
BinarySearchTreeNode *left,*right;
};
void InsertNode(BinarySearchTreeNode *&root,int key)
{
if(!root)
{
BinarySearchTreeNode *newnode=new BinarySearchTreeNode;
newnode->data=key;
newnode->left=newnode->right=NULL;
root=newnode;
}
else
{
if(key<root->data)
InsertNode(root->left,key);
else if(key>root->data)
InsertNode(root->right,key);
else if(key==root->data)
cout<<"树中已有该节点"<<endl;
}
}
void Search(BinarySearchTreeNode *root,int s,int a)
{
if(!root) return;
if(s+root->data>a) { return; }
path[++top]=root->data;
if(s+root->data==a&&root->left==NULL&&root->right==NULL)
{
for(int k=0;k<=top;++k)
cout<<path[k]<<" ";
cout<<endl;
}
if(root->left) Search(root->left,s+root->data,a);
if(root->right) Search(root->right,s+root->data,a);
--top; //左右子树完成后或者不行 删除该根节点
}
int main()
{
BinarySearchTreeNode *root=new BinarySearchTreeNode;
root=NULL;
int a[5]={10,5,7,4,12};
for(int j=0;j<5;++j)
InsertNode(root,a[j]);
Search(root,0,22);
system("pause");
return 0;
}