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

算法设计:

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

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

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

4、删除该结点。包括从当前和变量中减去结点值,从vector中弹出结点值。

#include <iostream>
#include <vector>
#include <stdlib.h>

using namespace std;

typedef struct node
{
	int data;
	struct node* lchild;
	struct node* rchild;
}BinTree;

void addTree(BinTree **T, int num)
{
	if (*T==NULL)
	{
		(*T)=(BinTree* )malloc(sizeof(BinTree));
		(*T)->data=num;
		(*T)->lchild=NULL;
		(*T)->rchild=NULL;
	}
	else if((*T)->data < num)
	{
		addTree((&(*T)->lchild),num);
	}
	else if ((*T)->data > num)
	{
		addTree((&(*T)->rchild),num);
	}
	else 
	{
		cout<<"相同的数据加载"<<endl;
	}

}

void findPath(BinTree *T, int total, vector<int> &ivec, int &sum)
{
	if (T==NULL)
	{
		return;
	}
	sum+=T->data;
	ivec.push_back(T->data);
	bool isLeaf;
	isLeaf=!(T->lchild) && !(T->rchild);
	if (isLeaf && total==sum)
	{
		for(vector<int>::iterator iter=ivec.begin(); iter!=ivec.end(); ++iter)
		{
			cout<<*iter<<"  ";
		}
		cout<<endl;
	}

	if (T->lchild)
	{
		findPath(T->lchild, total, ivec, sum);
	}
	if (T->rchild)
	{
		findPath(T->rchild, total, ivec, sum);
	}
	sum-=T->data;
	ivec.pop_back();
}

int main()
{
	BinTree* T=NULL;
	addTree(&T, 10);
	addTree(&T, 12);
	addTree(&T, 5);
	addTree(&T, 7);
	addTree(&T, 4);
	vector<int> ivec;
	int sum=0;
	findPath(T,22,ivec,sum);
	return 0;
}

 

posted @ 2012-05-10 16:15  徐露  阅读(481)  评论(0编辑  收藏  举报