程序员面试题精选100题(04)-二元树中和为某一值的所有路径[数据结构]
来源:互联网 发布:weka数据挖掘实验报告 编辑:程序博客网 时间:2024/04/28 21:55
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
例如输入整数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<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();}
本文已经收录到《剑指Offer——名企面试官精讲典型编程题》一书中,有改动,书中的分析讲解更加详细。欢迎关注。我在英文版博客http://codercareer.blogspot.com/2011/09/no-04-paths-with-specified-sum-in.html也讨论了这个题目,感兴趣的读者可以参考。
本题已被九度Online Judge系统收录,欢迎读者移步到http://ac.jobdu.com/hhtproblems.php在线测试自己的代码。
博主何海涛对本博客文章享有版权。网络转载请注明出处http://zhedahht.blog.163.com/。整理出版物请和作者联系。对解题思路有任何建议,欢迎在评论中告知,或者加我微博http://weibo.com/zhedahht或者http://t.163.com/zhedahht与我讨论。谢谢。
- 程序员面试题精选100题(04)-二元树中和为某一值的所有路径[数据结构]
- 程序员面试题精选100题(04)-二元树中和为某一值的所有路径[数据结构]
- 程序员面试题精选100题(04)-二元树中和为某一值的所有路径[数据结构]
- 程序员面试题精选100题(04)-二元树中和为某一值的所有路径[数据结构]
- 程序员面试题精选100题(04)-二元树中和为某一值的所有路径
- [程序员面试题精选100题]4.二叉树中和为某一值的所有路径
- 程序员面试题精选100题(04)-在二元树中找出和为某一值的所有路径
- 程序员面试题精选100题(04)-在二元树中找出和为某一值的所有路径
- 程序员面试题精选100题(04)-在二元树中找出和为某一值的所有路径
- 面试题-二元树中和为某一值的所有路径[数据结构]
- 程序员面试题精选(04)-在二元树中找出和为某一值的所有路径
- 程序员面试题精选(04)-在二元树中找出和为某一值的所有路径
- 程序员面试题精选100题(04)-在二元树中找出和为某一值的所有路径—python实现
- 二元树中和为某一值的所有路径[数据结构]
- 二元树中和为某一值的所有路径[数据结构]
- 二元树中和为某一值的所有路径[数据结构]
- 程序员面试题精选(4):在二元树中找出和为某一值的所有路径
- 二元树中和为某一值的所有路径
- 【面向对象】抽象类和接口的对比学习
- OpenJudge百炼习题解答(C++)--题4022:买房子
- LeetCode刷题之第一题——TwoSum
- JS中的“!!”
- CMake+VS2013编译与安装32/64位PCL1.8RC1源码(附网盘链接)
- 程序员面试题精选100题(04)-二元树中和为某一值的所有路径[数据结构]
- Caffe训练过程:test_iter test_interval等概念
- Perl异常处理方法总结
- arm-linux-gcc工具链安装FreeTpye 编译的支持
- HDU - 4046 Panda
- CSS高级技巧
- 程序员面试题精选100题(05)-查找最小的k个元素[算法]
- 《Linux操作系统编译构建指南》
- 相对布局RelativeLayout详解