树的子结构
来源:互联网 发布:背单词软件 编辑:程序博客网 时间:2024/05/18 18:52
题:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路:首先要判定B是不是A的子结构。则需要判断B的根节点是否存在于A里面。这个很好写,直接递归遍历树A找出节点值等于B的根节点值的节点即可。
找到之后需要匹配B和从A中找出的这个节点是否一样,如果不一样,再从当前节点的左右子树一直找,找到后再匹配。一直重复查找-匹配这两步直到匹配成功或者遍历完A树为止。
怎么匹配呢。当然也是递归。依次匹配找到的节点和树B的左右子树,在遍历到树B的叶子节点之前,如果有节点的值不匹配,直接返回false。
代码:
/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Solution { public boolean HasSubtree(TreeNode root1,TreeNode root2) { if(root1 == null || root2 == null) return false; TreeNode node = findNode(root1, root2); while (node != null){ // 如果匹配成功,结束查找 if(equalsNode(node, root2)) return true; else { // 匹配不成功,继续查找 TreeNode n = findNode(node.left, root2); // 再匹配 if(equalsNode(n, root2)) return true; // 匹配不成功,再查找 node = findNode(node.right, root2); } } return false; } public TreeNode findNode(TreeNode node1, TreeNode node2){ if(node1 == null || node2 == null) return null; TreeNode node; // 查找成功 if(node1.val == node2.val) { return node1; }else { // 查找不成功,从左子树开始继续查找 node = findNode(node1.left, node2); if(node != null) return node; // 左子树没找到,再从右子树开始查找 node = findNode(node1.right, node2); } return node; } public boolean equalsNode(TreeNode node1, TreeNode node2){ // 如果B树已经到叶子节点,说明匹配成功 if(node2 == null) return true; // 如果A数已经到叶子节点,说明匹配失败 if(node1 == null) return false; if(node1.val != node2.val) return false; // 继续匹配树的下一层左右子树 return equalsNode(node1.left, node2.left) && equalsNode(node1.right, node2.right); }}
呕心沥血写出来的,转载请一定注明出处!
阅读全文
0 0
- 树的子结构
- 树的子结构
- 树的子结构
- 树的子结构
- 树的子结构
- 树的子结构
- 树的子结构
- 树的子结构
- 树的子结构
- 树的子结构
- 树的子结构
- 树的子结构
- 树的子结构
- 树的子结构
- 树的子结构
- 树的子结构
- 树的子结构
- 树的子结构
- 为什么会有session 和 cookie ,以及两者的区别
- 后台项目中用javaScript实现显示动态时间。。。
- 动画约束之层动画(一)
- java获取指定位数的随机数和字母
- Linux内核两种编译方式
- 树的子结构
- 面试题记录第二节——(Binder)
- 剑指offer 24 二叉搜索树的后序遍历序列
- vue项目中添加百度地图功能及解决遇到的问题详解
- YTU OJ 2775: 字母的争论
- LEMP
- jquery.cookie.js 使用方法
- 使用YASM编程 -07 模拟导入表
- spring--总体初始