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

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

10

 / \

5  12

/ \ / \

4 7 8 9

则打印出两条路径: 10, 12
和10, 5,7。二元树节点的数据结构定义为:

structBinaryTreeNode // a nodein thebinarytree

{

intm_nValue; // valueof node

BinaryTreeNode *m_pLeft; // leftchildof node

BinaryTreeNode *m_pRight; //right childof node

structBinaryTreeNode
// a nodein thebinarytree

{

intm_nValue; // valueof node

BinaryTreeNode *m_pLeft; // leftchildof node

BinaryTreeNode *m_pRight; //right childof node

}

#include<stdio.h>
#include<stdlib.h>  

#define MAX 20  

typedef struct BiTreeNode
{
    int data;
    struct BiTreeNode *left;
    struct BiTreeNode *right;
}BiTreeNode_T;  

/*创建二叉树*/
BiTreeNode_T * CreateBSTree(int *data,int pos,int len)
{
    BiTreeNode_T * tr;
    if(pos>=len)
    {
        return NULL;
    }
    else
    {
        tr = (BiTreeNode_T *)malloc(sizeof(BiTreeNode_T));
        tr->data = data[pos];
        tr->left =  CreateBSTree(data, 2*pos+1, len);
        tr->right = CreateBSTree(data, 2*pos+2, len);
        return tr;
    }
}  

//中序遍历二叉树
void InOrderTraverse(BiTreeNode_T *root)
{
    if(root !=NULL)
    {
        InOrderTraverse(root->left);   

		if(NULL != root->left || NULL != root->right)
			printf("%d not leaf node\n", root->data);
		else
			printf("%d \n",root->data);

        InOrderTraverse(root->right);
    }
}  

//打印路径
void printPath(int path[], int top)
{
	int i = 0;
    for(i=0; i<top; i++)
        printf("%d ", path[i]); 

    printf("\n");
}  

//查找和为sum的路径,path数组存放路径的值,top代表每个可行的路径中的元素个数
void findPath(BiTreeNode_T *root, int sum, int top, int path[])
{
    path[top++] = root->data;
    sum -= root->data;  

    if (root->left == NULL && root->right==NULL)
    {
        /*叶子节点情况*/
        if (sum == 0)
        {
            printPath(path, top);
			top--;
			sum += root->data;
        }
    }
    else
    {
        /*非叶子节点情况*/
        if(sum <= 0)
        {
            if(sum == 0)
               printPath(path, top);
			top--;
			sum += root->data;
			return;
        }

        if (root->left != NULL)
               findPath(root->left, sum, top, path);  

        if (root->right!=NULL)
               findPath(root->right, sum, top, path);
    }
}  

int main()
{
    int data[]={10, 5, 12, 15, 7, 8, 9};
    int len=sizeof(data)/sizeof(int);  

    BiTreeNode_T * root = CreateBSTree(data, 0, len);
    InOrderTraverse(root);
    printf("\n");  

    int sum=22;
    int top=0;
    int path[MAX] = {0};
	printf("-------------------------------------\n");
    findPath(root, sum, top, path);
    return 0;
}
/*
打印
4
5 not leaf node
7
10 not leaf node
8
12 not leaf node
9 

-------------------------------------
10 5 7
10 12

*/
时间: 2024-10-11 22:33:40

在二元树中找出和为某一值的所有路的相关文章

(转)在二元树中找出和为某一值的所有路径,java版本

摘自:http://www.cnblogs.com/qi09/archive/2011/05/24/2055643.html 4.在二元树中找出和为某一值的所有路径 题目:输入一个整数和一棵二元树. 从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径. 打印出和与输入整数相等的所有路径. 例如输入整数22 和如下二元树 10 / \ 5 12 /\ 4 7 则打印出两条路径:10, 12 和10, 5, 7. 二元树节点的数据结构定义为: struct BinaryTreeNode

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

http://zhedahht.blog.163.com/blog/static/254111742007228357325/ http://www.cnblogs.com/qi09/archive/2011/05/24/2055643.html 题目:输入一个整数和一棵二元树.从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径.打印出和与输入整数相等的所有路径. 例如输入整数22和如下二元树 10                                          

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

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4249910.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,故原出处已不好查到,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:输入一个整数和一棵二叉树.从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径.打印出和与输入整数相等的所有路径. 例如 输入整数22和如下二叉树 10  / \  5 

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

题目:输入一个整数和一棵二元树. 从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径. 打印出和与输入整数相等的所有路径. 例如输入整数 22 和如下二元树 : 10 / 5 12 /\ 47 则打印出两条路径:10, 12 和 10, 5, 7. 1 package data.structure.exercise; 2 3 import java.util.LinkedList; 4 5 6 public class BinaryTree extends BinarySearch

随机为一维数组赋值,找出其中的第二大值

int a[20] = {0}; 为数组中的元素赋值 for (int i = 0;  i < 20; i++) { a[i] = arc4random() % (50 - 10 + 1) + 10; printf("%d", a[i]); printf("\n"); } int max = a[0], sex = a[0]; max最大  sex第二大 for (int i = 0; i < 20; i++) { if (max < a[i])

python3实现在二叉树中找出和为某一值的所有路径

在二叉树中找出和为某一值的所有路径请写一个程序创建一棵二叉树,并按照一定规则,输出二叉树根节点到叶子节点的路径.规则如下:1.从最顶端的根结点,到最下面的叶子节点,计算路径通过的所有节点的和,如果与设置的某一值的相同,那么输出这条路径上的所有节点.2.从根节点遍历树时,请请按照左到右遍历,即优先访问左子树的节点.二叉树创建规则:从上到下一层一层的,按照从左到右的顺序进行构造输入"10,5,12,4,7"值,构造的树如下:1) 102) 10      /    5 3) 10     

C++算法之 在二叉树当中找出和为某一值的路径

题目:输入一个整数和一棵二元树. 从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径. 打印出和与输入整数相等的所有路径. 例如 输入整数22和如下二元树 10 / \ 5  12 / \  4    7 则打印出两条路径:10, 12和10, 5, 7. 采用先序遍历以及 栈的特性 后进先出: void PrintPath(BTree* pRoot,int sum, const int key) { static deque<int> stack; if (pRoot == N

算法题:找出一个数组中相加值最大的连续序列元素

package arithmetic; /** * @author SHI * 求一个数组中相加值最大的连续序列元素 */ public class MaxSequence { public static void main(String[] args) { int[] a=new int[]{-2,9,-3,4,-6,7,-6,4}; findBigSequence(a); } /** * 思想: (1)计算出该数组的所有元素和,假设该值为最大 * (2)从数组下标1到a.length-1依次

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

import java.util.*; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); long expectedSum = 0; boolean gotSum = false; while (cin.hasNext() && !gotSum) { String firstLine = cin.nextLine(); if (firstLin