标签:
题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
/** * 基本思路:1.判断树A和树B是否有相同的根结点 2.如果存在,判断A的子树是否和B树结构相同 3.如果不存在,A树向下遍历,重复步骤1,2 * 注意null的条件,hasSubTree中,如果两棵树都不为空才进行判断, * doesTree1HasTree2中,如果B树为空,则说明B树遍历完了,即匹配成功, * A树为空有两种情况(1)如果A树为空&&B树不为空说明不匹配, * (2)如果A树为空,B树为空,说明匹配。 * @param root1 A树 * @param root2 B树 * @return */ public boolean hasSubTree(BinaryTreeNode root1, BinaryTreeNode root2) { boolean result = false; if (root1 != null && root2 != null) { // 根节点相等,递归判断A中的以某个节点为根节点的子树是不是和树B具有相同的结构 if (root1.value == root2.value) { result = doesTree1HasTree2(root1, root2); } // 未匹配成功,A树向左子树递归查找与B树根节点相等的根结点 if (!result) { result = hasSubTree(root1.left, root2); } // 未匹配成功,A树向右子树递归查找与B树根节点相等的根结点 if (!result) { result = hasSubTree(root1.right, root2); } } return result; } private boolean doesTree1HasTree2(BinaryTreeNode root1, BinaryTreeNode root2) { // 递归到root2为空,说明B树是A树的子树 if (root2 == null) return true; if (root1 == null) { return false; } // 结点值不相同,肯定不是子树 if (root1.value != root2.value) { return false; } return doesTree1HasTree2(root1.left, root2.left) && doesTree1HasTree2(root1.right, root2.right); }
标签:
原文地址:http://www.cnblogs.com/zywu/p/5772619.html