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

原创 2015年07月06日 19:17:51
本题目选自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();
}

相关文章推荐

【从零单排之微软面试100题系列】01之二叉查找树与双向链表

本题目选自July大神博客系列【微软面试100题】:july大神,该系列我主要用来记录我的学习笔记。 题目描述:把二元查找数转变成排序的双向链表 要求:输入一棵二元查找树,不能创建任何新的节点,只...

程序员面试100题(算法)之二叉树中找出和为某一值的所有路径(含二叉树前序创建、遍历)

#include "stdafx.h" #include #include using namespace std; struct binaryTreeNode { binary...

【从零单排之微软面试100题系列】03之求子数组的最大和

本题目选自July大神博客系列【微软面试100题】:july大神,该系列我主要用来记录我的学习笔记。 题目描述:输入一个整形数组,数组里有正也有负。数组中连续的一个或多个整数组成一个子数组,每个子数...

【从零单排之微软面试100题系列】07之判断两个链表是否相交

本题目选自July大神博客系列【微软面试100题】:july大神,该系列我主要用来记录我的学习笔记。 题目描述:给出两个单向链表的头指针,判断两个链表是否相交。   分析思路: 如果只要判...

【从零单排之微软面试100题系列】02之包含 min 函数的栈

本题目选自July大神博客系列【微软面试100题】:july大神,该系列我主要用来记录我的学习笔记。 题目描述:设计包含 min 函数的栈 要求:定义栈的数据结构,添加一个min函数,能够得到栈的...

【从零单排之微软面试100题系列】05之查找最小的k个元素

本题目选自July大神博客系列【微软面试100题】:july大神,该系列我主要用来记录我的学习笔记。 题目描述:输入n个整数,输出其中最小的k个(k   分析思路:(本题亦见于《剑指offe...

【从零单排之微软面试100题系列】06之根据上排数写出下排数

本题目选自July大神博客系列【微软面试100题】:july大神,该系列我主要用来记录我的学习笔记。 题目描述:根据给出的上排的十个数,在其下排填出对应的十个数,要求下排每个数都是先前上排那十个...

【剑指Offer面试编程题】题目1368:二叉树中和为某一值的路径--九度OJ

这道题目的思路应该还是比较清晰的,首先DFS是基础,然后在DFS过程中记录过经过的节点,并注意更新路径的和值,当然也需要动态的维护好经过节点的序列,注意增删,也即访问的时候需要增,当需要往回撤时需要删...

程序员面试题精选100题(04)-在二元树中找出和为某一值的所有路径—python实现

程序员面试题精选100题(04)-在二元树中找出和为某一值的所有路径—python实现...

程序员面试题精选100题(04)-在二元树中找出和为某一值的所有路径

http://zhedahht.blog.163.com/blog/static/254111742007228357325/ 题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到...
  • ZCSYLJ
  • ZCSYLJ
  • 2011年09月28日 11:57
  • 299
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【从零单排之微软面试100题系列】04之二叉树中和为某一值的路径
举报原因:
原因补充:

(最多只允许输入30个字)