题目:
输入一个整数和一棵二元树,从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径,然后打印出和与输入整数相等的所有路径。
例如输入整数22和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12和10, 5, 7。
其中,二元树节点的数据结构定义为:
```
struct BinaryTreeNode // a node in the binary tree
{
int m_nValue; // value of node
BinaryTreeNode *m_pLeft; // left child of node
BinaryTreeNode *m_pRight; // right child of node
};
```
思路:递归求解
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct BinaryTreeNode // a node in the binary tree
{
int m_nValue; // value of node
BinaryTreeNode *m_pLeft; // left child of node
BinaryTreeNode *m_pRight; // right child of node
};
/*创建二叉树*/
void creatTree(BinaryTreeNode* &bTree, int *a, int pos, int len)
{
if (pos >= len)
{
bTree = NULL;
return;
}
bTree = (BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
bTree->m_pLeft = NULL;
bTree->m_pRight = NULL;
bTree->m_nValue = a[pos];
creatTree(bTree->m_pLeft, a, 2*pos+1, len);
creatTree(bTree->m_pRight, a, 2*pos+2, len);
}
/*先序遍历*/
void preOrderTree(BinaryTreeNode* bTree)
{
if (bTree == NULL)
{
return;
}
printf("%d ", bTree->m_nValue);
preOrderTree(bTree->m_pLeft);
preOrderTree(bTree->m_pRight);
}
/*中序遍历*/
void inOrderTree(BinaryTreeNode* bTree)
{
if (bTree == NULL)
{
return;
}
inOrderTree(bTree->m_pLeft);
printf("%d ", bTree->m_nValue);
inOrderTree(bTree->m_pRight);
}
/*后序遍历*/
void postOrderTree(BinaryTreeNode* bTree)
{
if (bTree == NULL)
{
return;
}
postOrderTree(bTree->m_pLeft);
postOrderTree(bTree->m_pRight);
printf("%d ", bTree->m_nValue);
}
void printPath(int data[], int index)
{
int i;
for (i=0; i<index; i++)
{
printf("%d\t", data[i]);
}
printf("\n");
}
int tag = 22;
/*说明:
sum为目标数当前和
data为存储的结果
index为当前存储数组的长度
*/
void findPath(BinaryTreeNode* bTree, int sum, int data[], int index)
{
data[index++] = bTree->m_nValue;
if (bTree->m_pLeft==NULL && bTree->m_pRight==NULL)
{
if (bTree->m_nValue+sum == tag)
{
printPath(data, index);
}
}
/*找到左支*/
if (bTree->m_pLeft != NULL)
{
findPath(bTree->m_pLeft, sum+bTree->m_nValue, data, index);
}
/*找到右支*/
if (bTree->m_pRight != NULL)
{
findPath(bTree->m_pRight, sum+bTree->m_nValue, data, index);
}
}
int main()
{
int a[] = {10, 5, 12, 4, 7};
BinaryTreeNode* bTree = NULL;
int path[100];
creatTree(bTree, a, 0, 5);
printf("先序遍历二叉树:\n");
preOrderTree(bTree);
printf("\n");
printf("中序遍历二叉树:\n");
inOrderTree(bTree);
printf("\n");
printf("后序遍历二叉树:\n");
postOrderTree(bTree);
printf("\n");
findPath(bTree, 0, path, 0);
return 0;
}