树的子结构
/* 剑指offer26:树的子结构
* 题目描述:输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
* 解题思路:遍历二叉树A如果A中某个结点R等于B的根节点,判断以R为根节点的子树是否等于B
* 测试数据:
* */
public class ShuDeZiJieGou {
public static void main(String[] args) {
TreeNode rootA = new TreeNode(-2);
rootA.left = new TreeNode(1);
//rootA.right = new TreeNode(5);
//rootA.left.left = new TreeNode(3);
TreeNode rootB = new TreeNode(-2);
rootB.left = new TreeNode(1);
rootB.right = new TreeNode(-2);
ShuDeZiJieGou_Solution solution = new ShuDeZiJieGou_Solution();
System.out.println(solution.isSubStructure(rootB, rootA));
}
}
class ShuDeZiJieGou_Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
if(A==null||B==null) return false;
boolean result = false;
//遍历根节点
if(treeEquals(A, B)) return true;
if(isSubStructure(A.left, B)||isSubStructure(A.right, B)) return true;
return result;
}
/* 判断以R为根节点的子树中是否有完全等于B
* 递归遍历两棵树,如果两根节点的值相等且B树未到叶子结点,比较R、B的左子树以及右子树
* 左右子树也完全相同返回true,如果两结点的值相同且B树到达叶子结点返回true
* */
public boolean treeEquals(TreeNode R,TreeNode B) {
if(R==null) return false;
if(B==null) return true;
if(R.val==B.val) {
if(B.left==null&&B.right==null) return true;
if((treeEquals(R.left, B.left)||treeEquals(R.right, B.right))&&B.left==null&&B.right==null) {
return true;
}
}
return false;
}
}