二叉树 判断是否为子树解题报告 (百度2016暑期实习笔试)
2016-04-22 11:14
866 查看
百度 2016 暑期实习在线笔试解题报告
题目:给定两个二叉树、判断其中一颗二叉树是否为另一颗二叉树的子树(假定树中的元素都是唯一的)
例如:二叉树
A: 6 和 B: 4
5 4 1 0
3 2 1 0
B 为 A 的子树
A: 6 和 B: 6
5 4 5 4
3 2 1 0
对于二叉树问题,最直观的解法 莫过于 分治递归了,
对于此问题 首先要找到 B 的根节点 在 A 中的匹配元素,然后 左右 节点递归的去匹配 (写递归程序时 大体逻辑不难,难点在与递归出口条件的判断,很容易疏忽一些细节)
看程序最能理解其中的逻辑与细节
题目:给定两个二叉树、判断其中一颗二叉树是否为另一颗二叉树的子树(假定树中的元素都是唯一的)
例如:二叉树
A: 6 和 B: 4
5 4 1 0
3 2 1 0
B 为 A 的子树
A: 6 和 B: 6
5 4 5 4
3 2 1 0
对于二叉树问题,最直观的解法 莫过于 分治递归了,
对于此问题 首先要找到 B 的根节点 在 A 中的匹配元素,然后 左右 节点递归的去匹配 (写递归程序时 大体逻辑不难,难点在与递归出口条件的判断,很容易疏忽一些细节)
看程序最能理解其中的逻辑与细节
public boolean isSub(Node root1, Node root2) { if (root2 == null) { // 空树肯定是 非空树的子树 return true; } return ismatch(root1, root2); } // 判断 根节点为root2的树是否为 根为root1树 的子树 private boolean ismatch (Node root1, Node root2) { if (root1 == null) { return false; } if (root1.val == root2.val) { // 找到 与 B 的根节点匹配的节点 if (match(root1, root2)) { // 然后 判断 这两个树是否匹配 return true; } } return ismatch(root1.left, root2) || ismatch(root1.right, root2); //递归的在 A 中找到与 B 的根节点匹配的节点 } // 判断两颗树 是否匹配 private boolean match(Node root1, Node root2) { if (root1 == null && root2 == null) { // 注意递归出口,只有匹配到叶节点 才算完全匹配 true return true; } if (root1 == null || root2 == null) { // 注意递归出口,只有匹配到叶节点 才算完全匹配 否则 false return false; } if (root1.val != root2.val) { // 节点元素不相等 , false return false; } return match(root1.left, root2.left) && match(root1.right, root2.right); // 分别比较左右节点 }
相关文章推荐
- Java、Android多线程、线程池
- 【蓝桥杯】【基础练习20】【龟兔赛跑预测】
- 安卓语言学习网站
- 推荐一些在线效率工具汇总(数据分析,舆情监测、图片语义识别等)
- TI的DSP、ST的ARM、Intel的X86浮点性能对比
- mongodb3.x java driver 细节
- getHeader("x-forwarded-for")获取真实IP
- android在线边缓存边播放mp4
- ubuntu16.04使用手札(三)——字体安装
- python 创建httpserver
- Android面试之旅
- 保存APP内所有异常
- 从指定位置剪切字符串
- Picasso源码解析--如何解决图片错位的问题
- Java中中文拼音的排序问题
- Oracle EBS中设置项目字段必填
- 每个程序员都会的 35 个 jQuery 小技巧
- Spring 配置oracle数据源的两种格式
- Linux基础学习
- C++第四次作业