您的位置:首页 > 职场人生

【从零单排之微软面试100题系列】04之二叉树中和为某一值的路径

2015-07-06 19:17 387 查看
本题目选自July大神博客系列【微软面试100题】:july大神,该系列我主要用来记录我的学习笔记。

题目描述:输入一课二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。

路径定义为:从根结点到叶结点的所有结点,即总是以根结点为起点,叶结点为终点。

二叉树结点定义:

struct BinaryTreeNode
{
int                    m_data;
BinaryTreeNode*        m_pLeft;
BinaryTreeNode*        m_pRight;
};


分析思路:(本题也见于《剑指offer》面试题25)

由于要先遍历根结点,故采用前序遍历。当遍历完某一路径时,应该退回到其父亲结点,而二叉树本身不具备这种功能,因此自然而然想到用栈的思想来解决。

当用前序遍历访问到某一结点时,将此结点添加到路径上,并累加该结点的值。如果遍历到叶结点且和刚好等于输入的整数,则当前路径符合要求,如果当前结点不是叶结点,则继续访问其子结点。当叶结点访问结束后,应该退回到其父亲结点,在此之前,需先将该叶结点从路径上删去。

可以考虑使用STL的vector来保存路径结点。之所以不用stack,是因为打印路径的时候,需要用到所有的路径结点,而stack只能返回top处的结点。

书中提供的参考代码如下:

void FindPath(BinaryTreeNode* pRoot, int checkSum)
{
if( pRoot == NULL)
return;
std::vector<int> path;
int curSum = 0;
FindPath(pRoot, checkSum, path, curSum);
}

void FindPath(BinaryTreeNode* pRoot, int checkSum, std::vector<int>& path, int curSum)
{
curSum += pRoot->m_data;
path.push_back(pRoot->m_data);

//如果是叶结点,并且路径上值之和等于输入的值,则打印这条路径
if( pRoot->m_Left == NULL && pRoot->m_pRight == NULL && curSum == checkSum )
{
std::vector<int>::iterator iter = path.begin();
for(; iter != path.end(); ++iter)
printf("%d\t", *iter);
printf("\n");
}
//如果不是叶结点,则继续遍历其子结点
if(pRoot->m_pLeft != NULL)
FindPath(pRoot->m_pLeft, checkSum, path, curSum);
if(pRoot->m_pRight != NULL)
FindPath(pRoot->m_pRight, checkSum, path, curSum);
//返回父亲结点之前,在路径上删除当前结点
path.pop_back();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息