博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在二元树中找出和为某一值的所有路径
阅读量:6302 次
发布时间:2019-06-22

本文共 1763 字,大约阅读时间需要 5 分钟。

题目:输入一个整数和一颗二元树。

从树的根节点开始往下访问一直到叶节点所经过的所有节点形成一条路径。打印出于输入整数相等的所有路径。

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

    10

    /   \

   5    12

  /  \  

4    7

则打印出两条路经10, 12和10, 5, 7

 

 

本文程序大部分直接摘抄微软等面试100题的帖子,测试是自己写的,所以测试很烂。

 

本算法的思想是,建立一个vector记录当前遍历的路径,还有一个变量用来记录当前路径的和。当遍历到一个叶节点便比较当前和与题目给出的那个整数是否相等,若相等,便顺序输出vector的所有值,那便是一条路径。

 

本算法是在二元树的前向遍历的递归算法的基础上完成的。

 

当访问一个节点时,首先改变当前路径的和,并将当前元素尾插如vector。然后判断当前节点是否是叶节点,当前和是否与那个整数相等。

当本节点访问完成,回溯时,也要改变当前路径的和的值,并从vector中删除当前节点值。#include<iostream>#include<vector>using namespace std;struct BinaryTreeNode{int m_nValue;BinaryTreeNode* m_pLeft;BinaryTreeNode* m_pRight;};void findPath(BinaryTreeNode* pbt,vector<int> &iqueue,int const &sum,int &middlevalue){if(!pbt)return;middlevalue += pbt->m_nValue;iqueue.push_back(pbt->m_nValue);if(middlevalue == sum && !pbt->m_pLeft && !pbt->m_pRight){vector<int>::iterator iter = iqueue.begin();for(;iter != iqueue.end();++iter)cout << *iter << '/t';cout << endl;}if(pbt->m_pLeft)findPath(pbt->m_pLeft,iqueue,sum,middlevalue);if(pbt->m_pRight)findPath(pbt->m_pRight,iqueue,sum,middlevalue);middlevalue -= pbt->m_nValue;iqueue.pop_back();}BinaryTreeNode* createBT(){BinaryTreeNode* pbt;int tmp;cin >> tmp;if(tmp == 0) return 0;else{pbt = new BinaryTreeNode;if(NULL == pbt) return 0;pbt->m_nValue = tmp;pbt->m_pLeft = createBT();pbt->m_pRight = createBT();}return pbt;}int main(){BinaryTreeNode* pbt = createBT();int sum = 22;int tmp = 0;vector<int> path;findPath(pbt,path,sum,tmp);}

 

那个二元树的建立可以输入题例输入顺序为10回车5回车4回车 0回车0回车7回车0回车0回车12回车0回车0回车,这个建立二元树的方法我也很蛋疼,可是我第一时间想到的就是这个。

 

 

那个程序是用g++编译的,呵呵,其实g++是什么东东我也不知道,反正很多细节我根本搞不明白,比如NULL在g++眼里和在vc眼里有什么区别,在什么情况下应该警告g++和vc也是不一致的,所以你要是碰巧想运行我这个程序,一下成功几乎不可能,肯定会有些细节问题要改一改,这个情况,以我现在这初级水平根本不知道怎么解决,这个问题写在这里,希望那位高人能给个链接什么的,可以详细说说c/c++编译器之间的 差别问题。

转载于:https://www.cnblogs.com/ConfuciusPei/archive/2011/06/24/5118427.html

你可能感兴趣的文章
nfd指令的详细说明
查看>>
安装VisualSvn Server时遇到的问题
查看>>
不用Visual Studio,5分钟轻松实现一张报表
查看>>
虚拟机备份克隆导致SQL SERVER 出现IO错误案例
查看>>
人脸识别 开放书籍 下载地址
查看>>
Notepad++配置Python开发环境
查看>>
用户组概念 和 挂载 概念
查看>>
如何快速获取ADO连接字符串
查看>>
AspNetPager控件的最基本用法
查看>>
sessionKey
查看>>
高性能Javascript--脚本的无阻塞加载策略
查看>>
Java 编程的动态性, 第4部分: 用 Javassist 进行类转换--转载
查看>>
完毕port(CompletionPort)具体解释 - 手把手教你玩转网络编程系列之三
查看>>
iOS8 Push Notifications
查看>>
各大名企笔试及面经大全(程序猿必读)
查看>>
Oracle 连接、会话数的查看,修改
查看>>
Python使用QRCode模块生成二维码
查看>>
英语学习的重要性
查看>>
Android中Handler引起的内存泄露
查看>>
原产地政策,jsonp跨域
查看>>