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

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

思路:

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

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

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

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

/** 
在二元树中找出和为某一值的所有路径
** author :xiaozhi xiong 
** date:2014-02-09
**/ 
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
struct node
{
    int data;
    struct node *lNode;
    struct node *rNode;
};
struct node *head;

struct node *createTree(int a[],int len)
{
    struct node *curNode,*nextNode,*newNode;
    int i=1;
    if(len<=0)
        return NULL;
    head=(struct node *)malloc(sizeof(struct node *));
    head->data =a[0];
    head->lNode =NULL;
    head->rNode =NULL;
    while(i<len)
    {
        newNode=(struct node *)malloc(sizeof(struct node *));
        newNode->data =a[i];
        newNode->lNode =NULL;
        newNode->rNode =NULL;

        curNode=head;
        if(head->data>a[i])
            nextNode=head->lNode ;
        else nextNode=head->rNode ;

        while(nextNode)
        {
            curNode=nextNode;
            if(curNode->data >a[i])
                nextNode=curNode->lNode ;
            else
                nextNode=curNode->rNode ;
        }

        if(curNode->data >a[i])
            curNode->lNode =newNode;
        else
            curNode->rNode =newNode;
        i++;
    }
    return head;
};
int path[10];
int sum;
int num;
void FindPath(struct node *p,int value)
{
	int i;
	if(p)
	{
		if(p->lNode==NULL&&p->rNode==NULL)
		{
			sum+=p->data ;
			num++;
			path[num]=p->data ;
			if(sum==value)
			{
				for(i=0;i<=num;i++)
					printf("%d  ",path[i]);
			}
			num--;
			sum-=p->data;
		}
		else
		{
			sum+=p->data ;
			num++;
			path[num]=p->data ;
			FindPath(p->lNode,value);
			FindPath(p->rNode ,value);
		}
	}
}

int main(void)
{
    int a[]={10,5,4,7,12};
    head=createTree(a,5);
	path[0]=head->data ;
	sum=path[0];
	num=0;
	FindPath(head->lNode,22);
	sum=path[0];
	num=0;
	printf("\n");
	FindPath(head->rNode,22);

	getchar();
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值