JZ-C-25

剑指offer第二十五题:二叉树中和为某一值的路径

  1 //============================================================================
  2 // Name        : JZ-C-25.cpp
  3 // Author      : Laughing_Lz
  4 // Version     :
  5 // Copyright   : All Right Reserved
  6 // Description : 二叉树中和为某一值的路径
  7 //============================================================================
  8
  9 #include <iostream>
 10 #include <stdio.h>
 11 #include "BinaryTree.h"
 12 #include <vector>
 13
 14 using namespace std;
 15
 16 void FindPath(BinaryTreeNode* pRoot, int expectedSum, std::vector<int>& path,
 17         int& currentSum); //函数声明
 18
 19 void FindPath(BinaryTreeNode* pRoot, int expectedSum) {
 20     if (pRoot == NULL) {
 21         return;
 22     }
 23     std::vector<int> path;
 24     int currentSum = 0; //当前路径值和
 25     FindPath(pRoot, expectedSum, path, currentSum);
 26 }
 27 void FindPath(BinaryTreeNode* pRoot, int expectedSum, std::vector<int>& path,
 28         int& currentSum) {
 29     currentSum += pRoot->m_nValue;
 30     path.push_back(pRoot->m_nValue);
 31     // 如果是叶结点,并且路径上结点的和等于输入的值
 32     // 打印出这条路径
 33     bool isLeaf = pRoot->m_pLeft == NULL && pRoot->m_pRight == NULL;
 34     if (isLeaf && currentSum == expectedSum) {
 35         printf("A path is found: ");
 36         std::vector<int>::iterator it = path.begin();
 37         for (; it != path.end(); it++) {
 38             printf("%d\t", *it);
 39         }
 40         printf("\n");
 41     }
 42     // 如果不是叶结点,则遍历它的子结点
 43     if (pRoot->m_pLeft != NULL)
 44         FindPath(pRoot->m_pLeft, expectedSum, path, currentSum);
 45     if (pRoot->m_pRight != NULL)
 46         FindPath(pRoot->m_pRight, expectedSum, path, currentSum);
 47
 48     // 在返回到父结点之前,在路径上删除当前结点,
 49     // 并在currentSum中减去当前结点的值 ★★
 50     currentSum -= pRoot->m_nValue;
 51     path.pop_back();
 52
 53 }
 54 // ====================测试代码====================
 55 void Test(char* testName, BinaryTreeNode* pRoot, int expectedSum) {
 56     if (testName != NULL)
 57         printf("%s begins:\n", testName);
 58
 59     FindPath(pRoot, expectedSum);
 60
 61     printf("\n");
 62 }
 63
 64 //            10
 65 //         /       66 //        5        12
 67 //       / 68 //      4  7
 69 // 有两条路径上的结点和为22
 70 void Test1() {
 71     BinaryTreeNode* pNode10 = CreateBinaryTreeNode(10);
 72     BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
 73     BinaryTreeNode* pNode12 = CreateBinaryTreeNode(12);
 74     BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
 75     BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);
 76
 77     ConnectTreeNodes(pNode10, pNode5, pNode12);
 78     ConnectTreeNodes(pNode5, pNode4, pNode7);
 79
 80     printf("Two paths should be found in Test1.\n");
 81     Test("Test1", pNode10, 22);
 82
 83     DestroyTree(pNode10);
 84 }
 85
 86 //            10
 87 //         /       88 //        5        12
 89 //       / 90 //      4  7
 91 // 没有路径上的结点和为15
 92 void Test2() {
 93     BinaryTreeNode* pNode10 = CreateBinaryTreeNode(10);
 94     BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
 95     BinaryTreeNode* pNode12 = CreateBinaryTreeNode(12);
 96     BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
 97     BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);
 98
 99     ConnectTreeNodes(pNode10, pNode5, pNode12);
100     ConnectTreeNodes(pNode5, pNode4, pNode7);
101
102     printf("No paths should be found in Test2.\n");
103     Test("Test2", pNode10, 15);
104
105     DestroyTree(pNode10);
106 }
107
108 //               5
109 //              /
110 //             4
111 //            /
112 //           3
113 //          /
114 //         2
115 //        /
116 //       1
117 // 有一条路径上面的结点和为15
118 void Test3() {
119     BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
120     BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
121     BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
122     BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
123     BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
124
125     ConnectTreeNodes(pNode5, pNode4, NULL);
126     ConnectTreeNodes(pNode4, pNode3, NULL);
127     ConnectTreeNodes(pNode3, pNode2, NULL);
128     ConnectTreeNodes(pNode2, pNode1, NULL);
129
130     printf("One path should be found in Test3.\n");
131     Test("Test3", pNode5, 15);
132
133     DestroyTree(pNode5);
134 }
135
136 // 1
137 //  138 //   2
139 //    140 //     3
141 //      142 //       4
143 //        144 //         5
145 // 没有路径上面的结点和为16
146 void Test4() {
147     BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
148     BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
149     BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
150     BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
151     BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
152
153     ConnectTreeNodes(pNode1, NULL, pNode2);
154     ConnectTreeNodes(pNode2, NULL, pNode3);
155     ConnectTreeNodes(pNode3, NULL, pNode4);
156     ConnectTreeNodes(pNode4, NULL, pNode5);
157
158     printf("No paths should be found in Test4.\n");
159     Test("Test4", pNode1, 16);
160
161     DestroyTree(pNode1);
162 }
163
164 // 树中只有1个结点
165 void Test5() {
166     BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
167
168     printf("One path should be found in Test5.\n");
169     Test("Test5", pNode1, 1);
170
171     DestroyTree(pNode1);
172 }
173
174 // 树中没有结点
175 void Test6() {
176     printf("No paths should be found in Test6.\n");
177     Test("Test6", NULL, 0);
178 }
179
180 int main(int argc, char** argv) {
181     Test1();
182     Test2();
183     Test3();
184     Test4();
185     Test5();
186     Test6();
187
188     return 0;
189 }
时间: 2024-10-07 09:20:39

JZ-C-25的相关文章

【Scala】Scala之Classes and Properties

一.前言 前面学习了控制结构,下面学习Scala的Class和Properties. 二.Class&Properties 尽管Scala和Java很类似,但是对类的定义.类构造函数.字段可见性控制等则不相同,Java更为冗长,Scala精炼.本章将通过Scala的构造函数工作原理来理解Scala的类和字段,当申明类构造函数参数和使用var.val.private关键字来修饰类的字段时,Scala编译器将会为你生成代码,根据字段修饰符不同,Scala编译器会生成不同的存取函数,本章也会展示如何重

C#操作Flash动画

对于在C#开发的过程中没有接触过Flash相关开发的人员来说,没有系统的资料进行学习,那么这篇文档针对于初学者来说是很好的学习DEMO. 本文章中的DEMO实现了C#的COM控件库中本来就带有对flash进行播放的控件,只是需要对flash的相关操作进行了解即可,先看看实现的效果. 阅读目录 实现效果 配置Flash的运行环境 实现逻辑 C#操作Flash的关键参数解析 Demo源码包(VS2013进行实现) 总结 回到顶部 实现效果 回到顶部 配置Flash的运行环境 1.在VS中创建好一个w

从源码的角度认识 AsyncTask

从源码的角度认识 AsyncTask 时间 2016-06-18 13:13:28  公众账号 原文  http://mp.weixin.qq.com/s?__biz=MzIzMjE1Njg4Mw==&mid=2650117724&idx=1&sn=50450d999b7130683129fc0a09af99e4 主题 AsyncTask 一.为什么需要工作者线程 我们知道,Android应用的主线程(UI 线程)肩负着绘制用户界面和及时响应用户操作的重任,为了避免"用户

什么值得买:一家论坛式导购网站的自我修养

什么值得买 的用户把这个网站亲切称为"色魔张大妈"(SMZDM演化而来),虽然这个昵称有些恶搞的成分,但这是一家我印象中这个时代为数不多的"正常"公司.它没有颠覆什么,但重新定义了什么是"值",并且改变了一大批人的消费习惯. 在电商领域,什么值得买从创立初始就在节奏与气质上特立独行,包括其至今都没有涉及"交易"环节.电商行业里,如果一家公司不擅长赶政策热点.赶创业故事热潮,很难在资本市场为自己谈到一个好价钱,没钱烧就没有资源支

《CODE》读后笔记——第14~25章

反馈与触发器 振荡器不需要人的干涉即可自主且不断地实现断开和闭合.所有计算机都靠某种振荡器来使其他部件同步工作. 当两个开关都断开时,电路有两个稳定状态,这样的一个电路称为触发器.触发器具有记忆性,可以保持信息. 触发器: <code>书中常用的电路 振荡器 分频器 8位行波(异步)计数器 8-1选择器 3-8译码器 字节与十六进制 看完这一章,个人认为十六进制的出现应该就是为了要简单清晰的表示字节吧.四进制表示就只比二进制缩短了1倍,八进制实现不了8个位组成的字节,二百五十六进制太复杂. 在

程序的载入和运行(五)——《x86汇编语言:从实模式到保护模式》读书笔记25

程序的载入和运行(五)--<x86汇编语言:从实模式到保护模式>读书笔记25 前面几篇博文最终把代码分析完了.这篇就来说说代码的编译.运行和调试. 1.代码的编译及写入镜像文件 之前我们都是在命令行输入命令进行编译和写入.源文件少的时候还不认为麻烦,当源文件多了,就会认为特别麻烦.有没有简单的方法呢? 当然有,就是用make工具. 1.1.什么是make工具 make是一个命令工具,它解释Makefile中的指令.在Makefile文件里描写叙述了整个project全部文件的编译顺序.编译规则

10.23 linux任务计划cron10.24chkconfig工具10.25 systemd管理服务10.26 unit介绍 10.27 target介绍

- 10.23 linux任务计划cron - 10.24 chkconfig工具 - 10.25 systemd管理服务 - 10.26 unit介绍 - 10.27 target介绍 - 扩展 1. anacron http://blog.csdn.net/strikers1982/article/details/4787226  2. xinetd服(默认机器没有安装这个服务,需要yum install xinetd安装) http://blog.sina.com.cn/s/blog_46

25个Linux相关的网站【转】

转自:http://www.cnblogs.com/Lindaman/p/4552805.html 下面是25个最具有影响力,也是最重要的Linux网站,这些网站提供了Linux的分发包,软件,文件,新闻,以及其它所有的关于Linux的东西.关于Linux的分发包历史,可以看看本站的这篇文章<Linux Distribution Timeline> 1. Linux.org 这个站点主要提供Linux相关的新闻.文档.教程,培训,以及其它一切和Linux相关的东西.这是你需要了解Linux开源

1010. Radix (25)(进制 + 二分 + 模拟)

Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The answer is "yes", if 6 is a decimal number and 110 is a binary number. Now for any pair of positive integers N1 and N2, your task is to find the rad

2016年12月25 至 2018年12月25,致未来

未来总是充满遐想,两年的时间给自己一个成长,多的是努力,今天又是一年圣诞,孤独感爆棚,这是必经之路吧:成功的路上总是充满孤独与落寞,看了一篇文章,这世界程序猿分为三等,天才型,理想型,庸才型:我想我要做第四种--勤奋型:给自己加油!两年很短,多一点努力吧! 2016/12/25  圣诞  合肥   雨 随感