二叉树中和为某一值的路径

来源:互联网 发布:广州软件培训学校 编辑:程序博客网 时间:2024/05/16 23:50
题目描述:

输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

输入:

每个测试案例包括n+1行:

第一行为2个整数n,k(1<=n<=10000),n表示结点的个数,k表示要求的路径和,结点编号从1到n。                                                                                                       

接下来有n行。这n行中每行为3个整数vi,leftnode,rightnode,vi表示第i个结点的值,leftnode表示第i个结点的左孩子结点编号,rightnode表示第i个结点的右孩子结点编号,若无结点值为-1。编号为1的结点为根结点。

输出:

对应每个测试案例,先输出“result:”占一行,接下来按字典顺序输出满足条件的所有路径,这些路径由结点编号组成,输出格式参照输出样例。

样例输入:
5 22
10 2 3
5 4 5
12 -1 -1
4 -1 -1
7 -1 -1
1 5
1 -1 -1
样例输出:
result:
A path is found: 1 2 5
A path is found: 1 3
result:
#include<stdio.h>#include<stdlib.h>#define MAX 1000struct BinaryTreeNode{int m_nValue;BinaryTreeNode* m_pLeft;BinaryTreeNode*     m_pRight;};int top=-1;int path[MAX];//用数组模拟辅助栈 //pop 使得top-- bool pop(){if(top<0)return false;top--;return true;}void findPath(BinaryTreeNode* pRoot,int  expectSum,int currentSum){if(pRoot==NULL)return;currentSum+=pRoot->m_nValue;path[++top]=pRoot->m_nValue;bool isLeaf =pRoot->m_pLeft==NULL&&pRoot->m_pRight==NULL;if(currentSum==expectSum&&isLeaf){printf("A path is found:");for(int i=0;i<=top;i++)printf("%d\t",path[i]);printf("\n");} if(pRoot->m_pLeft!=NULL)findPath(pRoot->m_pLeft,expectSum,currentSum);if(pRoot->m_pRight!=NULL)findPath(pRoot->m_pRight,expectSum,currentSum);currentSum-=pRoot->m_nValue;pop();}BinaryTreeNode* createTree(BinaryTreeNode* pRoot){int data;scanf("%d",&data);if(data!=-1){pRoot=(BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));if(pRoot==NULL)exit(0);pRoot->m_nValue=data;//递归左子树和右子树 pRoot->m_pLeft=createTree(pRoot->m_pLeft); pRoot->m_pRight=createTree(pRoot->m_pRight);return pRoot;}return NULL;}int main(){BinaryTreeNode* pTree;BinaryTreeNode* pRoot = createTree(pTree);int expectSum;int currentSum=0;scanf("%d",&expectSum);findPath(pRoot,expectSum,currentSum);return 0;}
结果:
0 0
原创粉丝点击