【从零单排之微软面试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();
}

剑指Offer面试题25(Java版):二叉树中和为某一值的路径

题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶结点所经过的所有的结点形成一条路径。 如下图,输入二叉树和整数22,则打印出两条路径,第一条路...
  • jsqfengbao
  • jsqfengbao
  • 2015年08月05日 09:08
  • 3165

【剑指offer】二叉树中和为某一值的路径

题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 输入: 每个测试案例包括n+1行: 第一行为2...
  • mmc_maodun
  • mmc_maodun
  • 2014年05月19日 08:18
  • 4161

剑指offer----二叉树中和为某一值的路径----java实现

输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 思路: 对于树的遍历一般就是深度遍历和广度遍历下四种中...
  • snow_7
  • snow_7
  • 2016年07月19日 17:25
  • 1441

剑指offer:二叉树中和为某一值的所有路径(java)

题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶结点所经过的所有的结点形成一条路径。 如下图,输入二叉树和整数22,则打印出两条路径,第一条...
  • abc7845129630
  • abc7845129630
  • 2016年10月03日 20:39
  • 732

微软经典面试100题系列(部分)

本文整理自:http://blog.csdn.net/v_july_v/article/details/6543438     1. 把二元查找树转变成排序的双向链表     题目: 输入一棵二元查...
  • zhoudaxia
  • zhoudaxia
  • 2014年07月10日 14:29
  • 16421

微软等数据结构+算法面试100题全部答案集锦

1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ ...
  • lipengshiwo
  • lipengshiwo
  • 2016年11月26日 17:28
  • 3400

微软等数据结构+算法面试100题全部答案集锦

微软等数据结构+算法面试100题全部答案集锦 作者:July、阿财。 时间:二零一一年十月十三日。 引言      无私分享造就开源的辉煌。      今是二零一一年十月十三...
  • GarfieldEr007
  • GarfieldEr007
  • 2015年10月06日 14:04
  • 5660

微软公司等数据结构+算法面试100题

微软等公司数据结构+算法面试100题(第1-100题)首次完整亮相 注:本文转自July的博客:http://blog.csdn.net/v_july_v/article/details/60572...
  • qq_33290787
  • qq_33290787
  • 2016年07月11日 11:02
  • 835

微软等数据结构+算法面试100题全部答案集锦

作者:July、阿财。 时间:二零一一年十月十三日。  引言      无私分享造就开源的辉煌。      今是二零一一年十月十三日,明日14日即是本人刚好开博一周年。在一...
  • idaretobe
  • idaretobe
  • 2015年01月13日 20:50
  • 1852

二叉树中和为某一值的路径

题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。import java.util.ArrayLi...
  • gloomysnow
  • gloomysnow
  • 2016年04月13日 18:42
  • 78
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【从零单排之微软面试100题系列】04之二叉树中和为某一值的路径
举报原因:
原因补充:

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