本文共 986 字,大约阅读时间需要 3 分钟。
思路:
1. 在树A中查找和根结点的值一样的结点.如果发现某一结点的值和树B的头结点的值相同,则进行第二步判断.
第二步:
2. 判断树A中以R为根结点的子树是不是和树B具有相同的结构.即如果结点R的值和树B的根节点不相同,则以R
为根节点的子树和树B肯定不是具有相同的结点;如果它们的值相同,则递归的判断它们各自的左右结点的值是不
是相同。
public boolean HasSubtree(TreeNode root1, TreeNode root2) { boolean flag = false; // 设置标志位flag,默认为false if (root1 != null && root2 != null) { if (root1.val == root2.val) // 如果根结点的值相同,就继续判断 { flag = DoesTree1HaveTree2(root1, root2); } // 比较树A左子树结点和树B根结点的值 if (!flag) flag = HasSubtree(root1.left, root2); // 比较树A右子树结点和树B根结点的值 if (!flag) flag = HasSubtree(root1.right, root2); } return flag; } private boolean DoesTree1HaveTree2(TreeNode root1, TreeNode root2) { // 树Ak到达叶节点,而树B没有到达时 if (root1 == null && root2 != null) return false; // 树B到达叶节点时 if (root2 == null) return true; // 树A中结点的值和树B中结点值不相等时 if (root1.val != root2.val) return false; // 继续比较树A和树B的左子树和右子树的情况 return DoesTree1HaveTree2(root1.left, root2.left) && DoesTree1HaveTree2(root1.right, root2.right); }