首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。 例如输入整数22和如下二元树 10
输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。 例如输入整数22和如下二元树 10
admin
2014-11-15
105
问题
输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
例如输入整数22和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12和10, 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
&path, // a pathfrom 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
::iterator iter =path.begin(); for(; iter != path.end(); ++ iter) std::cout<<*iter<<’\t’; std::cout<
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; //!!I think here is no use path.pop_back(); }
解析
转载请注明原文地址:https://kaotiyun.com/show/dDmZ777K
0
程序员面试
相关试题推荐
"Thecatdoesnotofferservices,"WilliamBurroughswrote."Thecatoffersitself."Butitdoessowithunapologeticcontradict
It’swellknownthatbeingbilingualhascognitivebenefits:switchingbetweentwolanguageshasbeencomparedtomentalgymnast
大整数数相乘的问题。
输入一个正数n,输出所有和为n连续正数序列。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。
在金山毒霸2008中,阻止下载运行.ActiveX控件。
在WindowsXP的桌面上创建名为“附件”的文件夹图标。
不能显示和编辑备注内容的视图模式是()A.普通视图B.大纲视图C.幻灯片视图D.备注页视图
下列关于通信技术的叙述中,错误的是________。
从目前技术来看,下列打印机中打印速度最快的是________。
IT服务风险管理中,风险的监控是指跟踪已识别的危险,检测残余风险和识别新的风险,保证风险计划的执行,并评价这些计划对减轻风险的有效性。风险监控是整个生命周期中一个持续进行的过程。下面______不是风险监控的基本方法。
随机试题
概述中国近代史上的三次思想解放思潮。(东北师范大学2014年历史学综合真题)
A.不易触及B.Courvoisier征阳性C.左季肋部和肋脊点有压痛D.上腹部肋下或左季肋部触及囊性肿物,位置固定,表面光滑,无压痛E.上腹部轻压痛胰头癌检查时表现为()
Thecurrentpolitical______ofourcountryisfavorableforforeigninvestments.
孕妇,28岁。妊娠28周。因上街散步意外碰撞出现持续性腹痛,查体:子宫硬如板状,有压痛,子宫比妊娠周数大,阴道无流血,胎心、胎动消失。诊断为重型胎盘早剥。通过以上病历分析,该孕妇最容易出现的并发症是
控制工程进度网络图的表现形式有()。
通过全国注册安全工程师执业资格考试的人员,可以在取得执业资格证书后()月内申请初始注册。
你觉得自己能够长时间地做枯燥、单调的工作吗?为什么?
下列选项中,说法错误的是()。
对于资产负债表日后事项中的非调整事项,下列叙述中正确的有()。
某公司研发了一种空调管理系统,基于人流量的检测数据,该系统会自动调整空调温度。应用该系统将使办公场所的空调用电量降低30%左右,但该系统推出几年以来,购买的单位并不多。以下哪项陈述最能合理地解释上述现象?
最新回复
(
0
)