【经典数据结构算法】(4)二叉树求和为定值的所有路径

 1 /*
2 题目:输入一个整数和一颗二叉树。
3 从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
4 打印出与输入整数相等的所有路径。
5 例如 输入整数22和如下二元树
6 10
7 / \
8 5 12
9 / \
10 4 7
11 则打印出两条路径:10,12和12,5,7
12 分析:
13 在二叉树中寻找满足条件的所有结点序列,需要输出所有的序列。
14 此时,很自然的就应该想到使用栈这样的数据结构。
15 访问结点为一个函数,在进入这个函数的时候,首先把要访问的结点压入栈中。
16 计算此时所有的路径长度,如果满足指定的条件,则输出序列。
17 如果存在子节点的时候,就需要递归调用该函数访问子节点。
18 最后在退出函数的时候,记得要将当前结点从栈中弹出。
19 总体的思想即是如此,下面为具体实现。
20 */
21
22 #include "stdafx.h"
23 #include <stdlib.h>
24 //二叉树的定义
25 typedef struct BinaryTreeNode
26 {
27 int m_nValue;
28 BinaryTreeNode *m_pLeft;
29 BinaryTreeNode *m_pRight;
30 }BinaryTreeNode,*pBinaryTreeNode;
31
32 //初始化结点
33 pBinaryTreeNode initNode(int value)
34 {
35 pBinaryTreeNode node=(pBinaryTreeNode)malloc(sizeof(BinaryTreeNode));
36 node->m_nValue=value;
37 node->m_pLeft=NULL;
38 node->m_pRight=NULL;
39 return node;
40 }
41
42 //定义一个栈结构,假定栈的最大空间为100
43 pBinaryTreeNode base[100];
44
45 //定义栈顶
46 int top=0;
47
48 //所求的路径长度
49 int target=22;
50
51 int i,sum;
52 void visit(pBinaryTreeNode root)
53 {
54 //将要访问的结点入栈
55 base[top]=root;
56 top++;
57
58 //计算当前值是否是所要求的路径长度
59 for(i=0,sum=0;i<top;i++)
60 {
61 sum+=base[i]->m_nValue;
62 }
63 if(sum==target)
64 {
65 //输出路径
66 printf("路径符合要求:\n");
67 for(i=0;i<top;i++)
68 {
69 printf("%d\t",base[i]->m_nValue);
70 }
71 printf("\n");
72 }
73 //如果存在子结点,则访问
74 if(root->m_pLeft)
75 visit(root->m_pLeft);
76 if(root->m_pRight)
77 visit(root->m_pRight);
78
79 //出栈当前结点
80 top--;
81 }
82 int _tmain(int argc, _TCHAR* argv[])
83 {
84 //构造一颗二叉树,如同题目中的二叉树
85 pBinaryTreeNode root=initNode(10);
86 root->m_pLeft=initNode(5);
87 root->m_pRight=initNode(12);
88 root->m_pLeft->m_pLeft=initNode(4);
89 root->m_pLeft->m_pRight=initNode(7);
90
91 visit(root);
92 return 0;
93 }

原文地址:https://www.cnblogs.com/XjChenny/p/2256364.html