题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶节点所经过的结点形成一条路径。(一道好题!)
#include "stdlib.h"
#include "iostream"
#include "stack"
#include "queue"
using namespace std;
typedef int KeyType;
typedef struct Node
{
KeyType key;
struct Node* left;
struct Node* right;
struct Node* parent;
}Node,*pNode;
void insert(pNode* root,KeyType key)
{ //初始化插入结点
pNode p =(pNode)malloc(sizeof(Node));
p->key =key;
p->left =p->right =p->parent =NULL;
if((*root)==NULL){
*root =p;
return;
}
//插入到当前结点(*root)的左孩子
if ((*root)->left ==NULL&&(*root)->key>key)
{
p->parent =(*root);
(*root)->left =p;
return;
}
if ((*root)->right ==NULL&&(*root)->key<key)
{
p->parent =(*root);
(*root)->right =p;
return;
}
if ((*root)->key>key)
{
insert(&(*root)->left,key);
}
else if((*root)->key<key)
insert(&(*root)->right,key);
else
return;
}
void create(pNode* root,KeyType *keyArray,int length)
{
int i;
//逐个结点插入二叉树
for (i=0;i<length;i++)
{
insert(root,keyArray[i]);
}
}
void print(pNode root)
{
queue<pNode> queue1;
pNode p;
if (root)
{
queue1.push(root);
}
while(!queue1.empty())
{
p =queue1.front();
cout<<p->key<<" "<<endl;
if (p->left)
{
queue1.push(p->left);
}
if (p->right)
{
queue1.push(p->right);
}
queue1.pop();
}
}
void FindPath(pNode pRoot,int expectedSum,std::vector<int>& path,int currentSum)
{
currentSum +=pRoot->key;
path.push_back(pRoot->key);
//如果是叶节点,并且路径上结点的和等于输入的值
bool isLeaf =pRoot->left ==NULL&&pRoot->right ==NULL;
if (currentSum ==expectedSum&&isLeaf)
{
cout<<"A path is found: ";
std::vector<int>::iterator iter =path.begin();
for (;iter!=path.end();++iter)
{
cout<<*iter<<"\t";
}
cout<<endl;
}
//如果不是叶节点,则遍历它的子节点
if (pRoot->left !=NULL)
{
FindPath(pRoot->left,expectedSum,path,currentSum);
}
if (pRoot->right !=NULL)
{
FindPath(pRoot->right,expectedSum,path,currentSum);
}
path.pop_back();
}
void FindPath(pNode pRoot,int expectedSum)
{
if (pRoot ==NULL)
{
return;
}
std::vector<int> path;
int currentSum =0;
FindPath(pRoot,expectedSum,path,currentSum);
}
int main()
{
int i;
//注意这种传参数的方式,以root地址作为参数,返回根节点的指针
pNode root =NULL;
KeyType nodeArray[11] ={15,6,18,3,7,17,20,2,4,13,9};
create(&root,nodeArray,11);
//inorderTraver(root);
// print(root);
FindPath(root,26);
printf("\n");
}