/*
* 面试题26:树的子结构
* 题目:输入两棵二叉树A,B,判断B是不是A的子结构
* 思路:要查找树A中是否存在和树B结构一样的子树,我们可以分为两步:
* 第一步在树A中找到和树B的根结点的值一样的结点R,第二步再判断树A中以R为根结点的子树是不是包含和B一样的结构。
* 通常我们都会采用递归的方式,但是这里需要注意的检查边界条件,即空指针。
*/
class TreeNode2 {
double val = 0;
TreeNode2 left = null;
TreeNode2 right = null;
public TreeNode2(int val) {
this.val = val;
}
}
public class HasSubtree {
public static void main(String[] args) {
TreeNode2 root1 = new TreeNode2(8);
TreeNode2 node8 = new TreeNode2(8);
TreeNode2 node7 = new TreeNode2(7);
root1.left = node8;
root1.right = node7;
TreeNode2 node9 = new TreeNode2(9);
node8.left = node9;
TreeNode2 node2 = new TreeNode2(2);
node8.right = node2;
TreeNode2 node4 = new TreeNode2(4);
TreeNode2 node72 = new TreeNode2(7);
node2.left = node4;
node2.right = node72;
TreeNode2 root2 = new TreeNode2(8);
TreeNode2 node92 = new TreeNode2(9);
TreeNode2 node22 = new TreeNode2(2);
root2.left = node92;
root2.right = node22;
System.out.println(HasSubtree(root1, root2));
}
public static boolean HasSubtree(TreeNode2 root1, TreeNode2 root2) {
boolean result = false;
if (root1 != null && root2 != null) {
//第一步在树A中查找与根节点的值一样的节点,即树的遍历,采用递归调用HasSubtree遍历二叉树A。
//如果没发现这个值相同的节点,则调用doesTree1HaveTree2,进行第二步判断
if (!result) {
result = HasSubtree(root1.left,root2);
}
if (!result) {
result = HasSubtree(root1.right,root2);
}
//第二步是判断树A中以R为根节点的子树是不是和树B具有相同的结构。
if (eEqual(root1.val, root2.val)) {
result = doesTree1HaveTree2(root1, root2);
}
}
return result;
}
private static boolean doesTree1HaveTree2(TreeNode2 root1, TreeNode2 root2) {
if (root2 == null) {
return true;
}
if (root1 == null) {
return false;
}
//如果R与B值不相同,则肯定没有相同结构
if(!eEqual(root1.val,root2.val)) {
return false;
}
//如果相同,则递归的判断他们各自的左右节点的值是否相同
return doesTree1HaveTree2(root1.left,root2.left) && doesTree1HaveTree2(root1.right,root2.right);
}
//本题中节点值的类型为double。需要自己定义Equal
private static boolean eEqual(double val1, double val2) {
if ((val1 - val2 > -0.0000001) && (val1 - val2 < 0.0000001))
return true;
else
return false;
}
}
面试题26:树的子结构
最新推荐文章于 2025-01-23 21:29:32 发布