程序员面试题精选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
  • # 洗牌算法

    基本概念 等概率将将一个数组N打乱 概率每次都是1 N 加上 方法一 全局洗牌 从 0到N 1的数组下标 每次随机产生两个0到 N 1之间的数 进行交换 void get rand number int array int length i
  • 程序员面试题精选100题(41)-把数组排成最小的数

    程序员面试题精选100题 41 把数组排成最小的数 题目 输入一个正整数数组 将它们连接起来排成一个数 输出能排出的所有数字中最小的一个 例如输入数组 32 321 则输出这两个能排成的最小数字32132 请给出解决问题的算法 并证明该算法
  • 几种常用激活函数的简介

    1 sigmod函数 函数公式和图表如下图 在sigmod函数中我们可以看到 其输出是在 0 1 这个开区间内 这点很有意思 可以联想到概率 但是严格意义上讲 不要当成概率 sigmod函数曾经是比较流行的 它可以想象成一个神经元的放电率
  • 一致性hash算法 - consistent hashing

    一致性hash算法 consistent hashing consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出 目前在 cache 系统中应用
  • 图 深度优先遍历 广度优先遍历 非递归遍历 图解算法过程

    图的邻接矩阵表示 通常图的表示有两种方法 邻接矩阵 邻接表 本文用邻接矩阵实现 一是代码量更少 二是代码风格也更贴近C语言 但不论是图的哪种实现方式 其基本的实现思想是不变的 1 节点的信息 我们用一维数组a n 来存储 假设图共有n个节点
  • 迁移学习概述

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

    Strassen矩阵乘法简要解析 Strassen矩阵乘法具体描述如下 两个n n 阶的矩阵A与B的乘积是另一个n n 阶矩阵C C可表示为假如每一个C i j 都用此公式计算 则计算C所需要的操作次数为n3 m n2 n 1 a 其中m表
  • 程序员面试题精选100题(40)-扑克牌的顺子

    程序员面试题精选100题 40 扑克牌的顺子 题目 从扑克牌中随机抽5张牌 判断是不是一个顺子 即这5张牌是不是连续的 2 10为数字本身 A为1 J为11 Q为12 K为13 而大小王可以看成任意数字 分析 这题目很有意思 是一个典型的寓
  • 蓝桥题解(不定期更新)

    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
  • 【数学基础】 线性代数以及符号编总

    1基本概念和符号 线性代数可以对一组线性方程进行简洁地表示和运算 例如 对于这个方程组 这里有两个方程和两个变量 如果你学过高中代数的话 你肯定知道 可以为x1 和x2找到一组唯一的解 除非方程可以进一步简化 例如 如果第二个方程只是第一个
  • 程序员面试题精选100题(48)-二叉树两结点的最低共同父结点

    程序员面试题精选100题 48 二叉树两结点的最低共同父结点 题目 二叉树的结点定义如下 struct TreeNode int m nvalue TreeNode m pLeft TreeNode m pRight 输入二叉树中的两个结点
  • 基础算--简单枚举

    简单枚举 顾名思义 枚举便是依次列举出所有可能产生的结果 根据题中的条件对所得的结果进行逐一的判断 过滤掉那些不符合要求的 保留那些符合要求的 也可以称之为暴力算法 枚举结构 循环 判断语句 应用场合 在竞赛中 并不是所有问题都可以使用枚举
  • 程序员面试题精选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
  • 中文分词之HMM模型详解

    关于HMM模型的介绍 网上的资料已经烂大街 但是大部分都是在背书背公式 本文在此针对HMM模型在中文分词中的应用 讲讲实现原理 尽可能的撇开公式 撇开推导 结合实际开源代码作为例子 争取做到雅俗共赏 童叟无欺 没有公式 就没有伤害 模型介绍
  • 深度优先搜索——搜索与回溯,从n个数中取出r个数的排列

    5 2 1 include
  • 快速排序之“采取“尾递归”和“三数取中”技术的快速排序”

    快速排序之 采取 尾递归 和 三数取中 技术的快速排序 下面针对快速排序进行一些优化 QUICKSORT算法包含两个对其自身的递归调用 即调用PARTITION后 左边的子数组和右边的子数组分别被递归排序 QUICKSORT中的第二次递归调
  • 【滑动窗口】算法实战

    文章目录 一 算法原理 二 算法实战 1 leetcode209 长度最小的子数组 2 leetcode3 无重复字符的最长子串 3 leetcode1004 最大连续1的个数 4 leetcode1685 将x减到0的最小操作数 5 le
  • CRC-模2除法

    在循环冗余校验码 CRC 的计算中有应用到模2除法 模2除法的特点就是 每一位除的结果不影响其它位 即不向上一位借位 模2除法原则 1 被除数的首位为1 商为1 2 被除数的首位为0 商为0 3 模2除法等同于按位异或 要保证每次除完首位都

随机推荐