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

2023-11-07

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

题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。

例如输入整数22和如下二元树

                                            10
                                           /   \
                                          5     12
                                        /   \   
                                      4     7 

则打印出两条路径:10, 1210, 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
};

分析:这是百度的一道笔试题,考查对树这种基本数据结构以及递归函数的理解。

当访问到某一结点时,把该结点添加到路径上,并累加当前结点的值。如果当前结点为叶结点并且当前路径的和刚好等于输入的整数,则当前的路径符合要求,我们把它打印出来。如果当前结点不是叶结点,则继续访问它的子结点。当前结点访问结束后,递归函数将自动回到父结点。因此我们在函数退出之前要在路径上删除当前结点并减去当前结点的值,以确保返回父结点时路径刚好是根结点到父结点的路径。我们不难看出保存路径的数据结构实际上是一个栈结构,因为路径要与递归调用状态一致,而递归调用本质就是一个压栈和出栈的过程。

参考代码:

///
// Find paths whose sum equal to expected sum
///
void FindPath
(
      BinaryTreeNode*   pTreeNode,    // a node of binary tree
      int               expectedSum,  // the expected sum
      std::vector<int>& path,         // a path from root to current node
      int&              currentSum    // the sum of path
)
{
      if(!pTreeNode)
            return;

      currentSum += pTreeNode->m_nValue;
      path.push_back(pTreeNode->m_nValue);

      // if the node is a leaf, and the sum is same as pre-defined, 
      // the path is what we want. print the path
      bool isLeaf = (!pTreeNode->m_pLeft && !pTreeNode->m_pRight);
      if(currentSum == expectedSum && isLeaf)
      {    
           std::vector<int>::iterator iter = path.begin();
           for(; iter != path.end(); ++ iter)
                 std::cout << *iter << '\t';
           std::cout << std::endl;
      }

      // if the node is not a leaf, goto its children
      if(pTreeNode->m_pLeft)
            FindPath(pTreeNode->m_pLeft, expectedSum, path, currentSum);
      if(pTreeNode->m_pRight)
            FindPath(pTreeNode->m_pRight, expectedSum, path, currentSum);

      // when we finish visiting a node and return to its parent node,
      // we should delete this node from the path and 
      // minus the node's value from the current sum
      currentSum -= pTreeNode->m_nValue;
      path.pop_back();
} 

这道题有扩展问题:详解网址:http://www.haogongju.net/art/1686313

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

程序员面试题精选100题(04)-二元树中和为某一值的所有路径 的相关文章

  • 归并排序,自顶向下,自底向上

    http blog csdn net cjf iceking article details 7920153
  • 程序员面试题精选100题(35)-两链表的第一个公共结点

    程序员面试题精选100题 35 两链表的第一个公共结点 题目 两个单向链表 找出它们的第一个公共结点 链表的结点定义为 struct ListNode int m nKey ListNode m pNext 分析 这是一道微软的面试题 微软
  • # 洗牌算法

    基本概念 等概率将将一个数组N打乱 概率每次都是1 N 加上 方法一 全局洗牌 从 0到N 1的数组下标 每次随机产生两个0到 N 1之间的数 进行交换 void get rand number int array int length i
  • 【NOIP 2004 提高组】合并果子

    题就自己找啦 各大OJ上应该都有 题目 题目描述 在一个果园里 多多已经将所有的果子打了下来 而且按果子的不同种类分成了不同的堆 多多决定把所有的果子合成一堆 每一次合并 多多可以把两堆果子合并到一起 消耗的体力等于两堆果子的重量之和 可以
  • 算法基础--递归与回溯、递推、迭代关系

    递归的优缺点 优点 代码更简洁清晰 可读性更好 实际上递归的代码更清晰 但是从学习的角度要理解递归真正发生的什么 是如何调用的 调用层次和路线 调用堆栈中保存了什么 可能是不容易 但是不可否认递归的代码更简洁 缺点 由于递归需要系统堆栈 所
  • 一道创新工场面试题详解:共打了多少鱼?

    一道创新工场面试题详解 共打了多少鱼 题目 abcde五人打渔 打完睡觉 a先醒来 扔掉1条鱼 把剩下的均分成5分 拿一份走了 b再醒来 也扔掉1条 把剩下的均分成5份 拿一份走了 然后cde都按上面的方法取鱼 问他们一共打了多少条鱼 解法
  • 编程珠玑第三章习题5——英语中的连字符问题

    编程珠玑第三章习题5 英语中的连字符问题 问题 本问题将处理一小部分用连字符连接的英语单词方面的问题 下面的规则列表描述了一些以字母c结尾的单词的有效连字符连接 et ic al is tic s tic p tic lyt ic ot i
  • 一致性hash算法 - consistent hashing

    一致性hash算法 consistent hashing consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出 目前在 cache 系统中应用
  • 编写一个"banner"函数,该函数的输入为大写字母

    编写一个 banner 函数 该函数的输入为大写字母 题目 编写一个 banner 函数 该函数的输入为大写字母 输出为一个字符数组 该数组以图像化的方式表示该字母 编程 珠玑 上提到当要 输入 的 数据 很多 且没有 规律 时 可以 考虑
  • 迁移学习概述

    1 迁移学习的背景 在有监督的机器学习和尤其是深度学习的场景应用中 需要大量的标注数据 标注数据是一项枯燥无味且花费巨大的任务 关键是现实场景中 往往无法标注足够的数据 而且模型的训练是极其耗时的 因此迁移学习营运而生 传统机器学习 主要指
  • strassen矩阵乘法

    Strassen矩阵乘法简要解析 Strassen矩阵乘法具体描述如下 两个n n 阶的矩阵A与B的乘积是另一个n n 阶矩阵C C可表示为假如每一个C i j 都用此公式计算 则计算C所需要的操作次数为n3 m n2 n 1 a 其中m表
  • 蓝桥题解(不定期更新)

    597 跑步锻炼 import math if name main moth 0 31 28 31 30 31 30 31 31 30 31 30 31 day 6 ans 0 for year in range 2000 2021 if
  • 程序员面试题精选100题(31)-从尾到头输出链表

    程序员面试题精选100题 31 从尾到头输出链表 题目 输入一个链表的头结点 从尾到头反过来输出每个结点的值 链表结点定义如下 struct ListNode int m nKey ListNode m pNext 方法一 看到这道题后 第
  • 枚举子集复杂度 O(n^3) 证明

    困扰多年的问题 居然在学习离散数学后的一分钟内得到解决 形式化问题为 求满足 A B S A sube B sube S A B S 的有序对
  • Java算法基础:使用递归算法实现,平方相加1^2 + 2^2 + 3^2 +...+ n^2。

    package algorithm recursion public class RecursionTest public static void main String args int m 5 int sumOfSquares sumO
  • 程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表

    程序员面试题精选100题 01 把二元查找树转变成排序的双向链表 参见博客 http zhedahht blog 163 com blog static 254111742007127104759245 http www cnblogs c
  • c++二分查找—来自编程珠玑

    c 二分查找 来自编程珠玑 二分查找法 Binary search algorithm 是一个很常见的算法 从 编程珠玑 里再次看到时又有新的收获 直接看代码吧 下面是常见的实现代码 int binary search int a int
  • 深度优先搜索——搜索与回溯,从n个数中取出r个数的排列

    5 2 1 include
  • 贪心算法——排队打水问题

    6 3 排队打水问题 有n个人排队到r个水龙头去打水 他们装满水桶的时间为t1 t2 tn为正整数且个不相等 应如何安排他们打水顺序才能使他们花费的时间最少 算法分析 时间总和 等待时间 装水时间 采用贪心思想 先sort 默认将装水时间从
  • LU分解,LDLT分解,Cholesky分解

    LU分解 如果方阵是非奇异的 即的行列式不为0 LU分解总是存在的 A LU 将系数矩阵A转变成等价的两个矩阵L和U的乘积 其中L和U分别是下三角和上三角矩阵 而且要求L的对角元素都是1 形式如下 本质上 LU分解是高斯消元的一种表达方式

随机推荐