题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如输入整数22 和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12 和10, 5, 7。
代码如下:
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如输入整数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<iostream>
#include<vector>
using namespace std;
struct BiTreeNode
{
int m_nValue;
BiTreeNode *m_pleft;
BiTreeNode *m_pright;
};
void addBiTreeNode(BiTreeNode *&pCurrent, int value);
void printPaths(BiTreeNode *pRoot, int sum, vector<int> &path, int ¤tSum);
int main()
{
BiTreeNode *pRoot = NULL;
addBiTreeNode(pRoot, 10);
addBiTreeNode(pRoot, 5);
addBiTreeNode(pRoot, 4);
addBiTreeNode(pRoot, 7);
addBiTreeNode(pRoot, 12);
vector<int> path;
int sum = 22, currentSum = 0;
printPaths(pRoot, sum, path, currentSum);
return 0;
}
void addBiTreeNode(BiTreeNode *&pCurrent, int value)
{
if(pCurrent == NULL)
{
BiTreeNode *pBiTree = new BiTreeNode();
pBiTree->m_nValue = value;
pBiTree->m_pleft = NULL;
pBiTree->m_pright = NULL;
pCurrent = pBiTree;
}
else
{
if((pCurrent->m_nValue) > value)
addBiTreeNode(pCurrent->m_pleft, value);
else if((pCurrent->m_nValue) < value)
addBiTreeNode(pCurrent->m_pright, value);
}
}
void printPaths(BiTreeNode *pRoot, int sum, vector<int> &path, int ¤tSum)
{
if(pRoot == NULL)
return ;
currentSum += pRoot->m_nValue;
path.push_back(pRoot->m_nValue);
if(pRoot->m_pleft == NULL && pRoot->m_pright == NULL)
{
if(sum == currentSum)
{
vector<int>::iterator it;
for(it = path.begin(); it != path.end(); it ++)
cout<<*it<<" ";
cout<<endl;
}
}
if(pRoot->m_pleft != NULL)
printPaths(pRoot->m_pleft, sum, path, currentSum);
if(pRoot->m_pright != NULL)
printPaths(pRoot->m_pright, sum, path, currentSum);
currentSum -= pRoot->m_nValue;
path.pop_back();
}