/*******************************************************************
Copyright(c) 2016, Tyrone Li
All rights reserved.
*******************************************************************/
// 作者:TyroneLi
///*
Q:二叉树中和为某一个值得路径。输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入的某一整数的所有路径。树的路径定义:从树的根结点开始往下一直到叶子结点的所形成的路线叫路径。
S:由于需要从根节点遍历直至叶子节点然后求满足的路径,因此需要通过回溯的方法去求出满足的路径。考虑需要先遍历根节点,考虑采用前序遍历的方法,当用前序遍历的方法访问到某个根节点的时候,把该节点加入到路径中,同时累加该节点的值。如果该节点是叶子节点而且路径中的结点值的和刚好是等于该整数,那么当前该路径满足条件;如果不是叶子节点则继续访问它的子节点,当前节点访问结束之后,递归函数将会自动回到它的父节点,在函数推出之前需要先减去该节点的值同时将该节点从路径上删除。*/#include "../utils/BinaryTree.h"
#include <iostream>
#include <vector>
#include <cstdio>
#include <cstdlib>void findMethod(BinaryTreeNode*pRoot, int g_sum, std::vector<int>&paths, int cur_sum)
{cur_sum += pRoot->m_nValue;paths.push_back(pRoot->m_nValue);bool is_leafNode = (pRoot->m_pLeft == nullptr && pRoot->m_pRight == nullptr);if(is_leafNode && (cur_sum == g_sum)){std::cout << "FInd one path." << std::endl;std::vector<int>::iterator iter = paths.begin();for(; iter != paths.end(); ++iter)std::cout << (*iter) << " ";std::cout << std::endl;}if(pRoot->m_pLeft != nullptr)findMethod(pRoot->m_pLeft, g_sum, paths, cur_sum);if(pRoot->m_pRight != nullptr)findMethod(pRoot->m_pRight, g_sum, paths, cur_sum);cur_sum -= pRoot->m_nValue;paths.pop_back();
}void findPaths(BinaryTreeNode*pRoot, int g_sum)
{if(pRoot == nullptr)return;int cur_sum = 0;std::vector<int> paths;findMethod(pRoot, g_sum, paths, cur_sum);
}void test_1()
{std::cout << "Test 1" << std::endl;BinaryTreeNode*pRoot_1 = createBinaryTreeNode(10);BinaryTreeNode*pRoot_2 = createBinaryTreeNode(5);BinaryTreeNode*pRoot_3 = createBinaryTreeNode(12);BinaryTreeNode*pRoot_4 = createBinaryTreeNode(4);BinaryTreeNode*pRoot_5 = createBinaryTreeNode(7);connectTreeNodes(pRoot_1, pRoot_2, pRoot_3);connectTreeNodes(pRoot_2, pRoot_4, pRoot_5);printTreePreOrder(pRoot_1);std::cout << std::endl;findPaths(pRoot_1, 22);std::cout << std::endl;
}void test_2()
{std::cout << "Test 2" << std::endl;BinaryTreeNode*pRoot_1 = createBinaryTreeNode(10);BinaryTreeNode*pRoot_2 = createBinaryTreeNode(5);BinaryTreeNode*pRoot_3 = createBinaryTreeNode(12);BinaryTreeNode*pRoot_4 = createBinaryTreeNode(4);BinaryTreeNode*pRoot_5 = createBinaryTreeNode(7);connectTreeNodes(pRoot_1, pRoot_2, pRoot_3);connectTreeNodes(pRoot_2, pRoot_4, pRoot_5);printTreePreOrder(pRoot_1);std::cout << std::endl;findPaths(pRoot_1, 32);std::cout << std::endl;
}void test_findPaths()
{test_1();test_2();
}int main(int argc, char**argv)
{test_findPaths();return 0;
}

剑指offer-二叉树中值等于某个数的路径相关推荐

  1. 剑指offer 矩阵中的路径 @python

    剑指offer 矩阵中的路径 @python 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向 ...

  2. C#刷剑指Offer | 二叉树中和为某一值的路径

    [C#刷题]| 作者 / Edison Zhou 这是EdisonTalk的第292篇原创内容 我们来用之前学到的数据结构知识来刷<剑指Offer>的一些核心题目(精选了其中30+道题目) ...

  3. 剑指offer 二叉树的深度

    剑指offer 牛客网 二叉树的深度 # -*- coding: utf-8 -*- """ Created on Wed Apr 10 09:29:36 2019@au ...

  4. 8. 返回数组里出现次数最多的数字_剑指offer 数组中出现次数超过一半的数字

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  5. 剑指offer: 二叉树中和为某一值的路径

    题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 注意在深度遍历的时候要回退结点 import j ...

  6. 求二叉树上结点的路径_剑指offer 二叉树

    二叉树的镜像(简单) 操作给定的二叉树,将其变换为源二叉树的镜像. 思路: 根节点左右节点调换位置 递归 注意判断空子树情况 二叉树的深度(简单) 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经 ...

  7. [剑指Offer]-二叉树的深度

    题目描述(一) 输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如下图中的二叉树的深度为4,因为它从根结点到叶结点最长 ...

  8. 剑指offer——整数中1出现的次数(从1到n整数中1出现的次数)

    题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...

  9. 剑指 offer 链表倒数的第k个数

    快慢指针 快指针线遍历到第k-1个数,然后慢指针在从头开始遍历,这样快慢指针有k-1个间隔,当快指针到链表末尾时,慢指针指的数就是倒数第k个数. public class Solution {     ...

  10. 剑指offer——数据流中的中位数

    题目: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值.我们使 ...

最新文章

  1. The SetStack Computer
  2. Spark _19 _Spark内存管理
  3. 图像处理直方图匹配-巴氏系数原理及实现
  4. 【django】三、常用的模板标签和过滤器
  5. angular 控件css_Angular父组件内修改子组件的样式
  6. c语言糖果游戏,幼儿园小班糖果游戏教案
  7. 决策树和基于决策树的集成方法(DT,RF,GBDT,XGB)复习总结
  8. react-native 自定义 下拉刷新 / 上拉加载更多 组件
  9. 微信小程序获取是android还是ios,微信小程序-手机操作系统以及微信版本判断
  10. 单片机控制步进电机-电路连接
  11. 中文python笔记
  12. 土木工程--钢筋下料软件(续)
  13. 兔子、狼、狐狸、王八
  14. Pexels Videos – 可以免费商业使用的短视频
  15. 冒号后面跟着function()是什么意思
  16. 使用dd命令测试CPU性能--用Enki学Linux系列(16)
  17. 群体智能集群机器人研究综述
  18. PC端自动化工具开发:Pywinauto的安装及使用
  19. 有源医疗器械的开发过程和各阶段的注意事项(六)——有源医疗器械研发涉及到的标准总结与介绍
  20. 关于频谱分析中两个重要指标:频率分辨率和时间分辨率的理解及计算

热门文章

  1. [免费专栏] Android安全之Root检测与Root绕过(浅析)
  2. Microsemi Libero使用技巧1——查看芯片资源占用情况
  3. Libero Soc v11.9的安装以及证书的获取(2021新版)
  4. PESSIMISTIC_READ PESSIMISTIC_WRITE 与 共享锁 排它锁
  5. java scavenge_Java垃圾收集器之Parallel Scavenge收集器
  6. 洛谷 P1007 独木桥 思维
  7. 后端Java人必备:30个优化SQL的良心建议
  8. Python爬虫开发学习全教程第二版,爆肝十万字【建议收藏】
  9. 基于matlab的眼部疲劳检测
  10. 自制BSL编程MSP430单片机