小渣渣的算法学习笔记:2018秋招备战
数据结构类算法总结:二叉树
数据结构类算法总结:二叉树
1.题目描述:
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
2.代码实现:
public class Solution26 { private static class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } public static void main(String[] args) { Solution26 s = new Solution26(); //A二叉树 TreeNode t1 = new TreeNode(8); TreeNode t2 = new TreeNode(6); TreeNode t3 = new TreeNode(10); TreeNode t4 = new TreeNode(5); TreeNode t5 = new TreeNode(7); TreeNode t6 = new TreeNode(9); TreeNode t7 = new TreeNode(11); t1.left=t2; t1.right=t3; t2.left=t4; t2.right=t5; t3.left=t6; t3.right=t7; //B二叉树 TreeNode t8 = new TreeNode(8); TreeNode t9 = new TreeNode(6); TreeNode t10 = new TreeNode(10); TreeNode t11 = new TreeNode(5); t8.left=t9; t8.right=t10; t9.left=t11; boolean b = s.HasSubtree(t1,t8); System.out.println(b); } //0.结点值类型为double,判断两个小数是否相等,需要判断他俩的绝对值之差是不是在很小的范围内 public boolean isEqual(double num1,double num2){ if((num1 -num2 > -0.0000001)&&(num1-num2<0.0000001)){ return true; }else{ return false; } } //1.判断在树A中查找与根结点值一样的结点-遍历树 public boolean HasSubtree(TreeNode root1,TreeNode root2){ boolean result = false; if(root1 != null&&root2 != null){ if(isEqual(root1.val,root2.val)) result = doesTree1HaveTree2(root1,root2); if(!result) result = HasSubtree(root1.left,root2); if(!result) result = HasSubtree(root1.right,root2); } return result; } //2.判断树A中以R为根结点的子树是不是和树B具有相同的结构 public boolean doesTree1HaveTree2(TreeNode root1,TreeNode root2){ if(root2 == null) return true; if(root1 == null) return false; if(!isEqual(root1.val,root2.val)) return false; return doesTree1HaveTree2(root1.left,root2.left)&&doesTree1HaveTree2(root1.right,root2.right); } }