您的位置:首页 > 编程语言

[编程之美-03]在二元树中找出和为某一值的所有路径

2016-10-18 23:32 501 查看
题目:输入一个整数和一棵二元树。

从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。

打印出和与输入整数相等的所有路径。

例如输入整数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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 微软