输入两棵二叉树A,B,判断B是不是A的子结构
约定空树不是任意一个树的子结构
代码
static class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val) {
this.val = val;
}
}
/**
* 树root2是否是树root1的字结构
*
* @param root1
* @param root2
* @return
*/
public static boolean hasSub(TreeNode root1, TreeNode root2) {
boolean result = false;
// 首先两棵树不能为null,否则必然不存在子结构一说
if (root1 != null && root2 != null) {
// 1. 首先找出相等的根节点
if (root1.val == root2.val) {
//2. 然后判断其结构是否相等
result = isSub(root1, root2);
}
// 根节点不相等,就从root1的左子树继续找是否存在与root2根节点相等的节点
if (!result) {
result = hasSub(root1.left, root2);
}
// 根节点不相等,root1的左子树也没有找到相等的节点,就从其右子树继续找是否存在与root2根节点相等的节点
if (!result) {
result = hasSub(root1.right, root2);
}
}
return result;
}
/**
* 树tree2是否与tree1的子结构
* @param tree1
* @param tree2
* @return
*/
public static boolean isSub(TreeNode tree1, TreeNode tree2) {
// 如果tree2为null了,说明是其子结构,因为tree2整个树都已经和tree1的某颗子树进行了完整比较,且都相同
if (tree2 == null) {
return true;
}
// 如果tree1此时为null,而tree2不为null,说明不是其子结构
// 因为tree1已经没有可用于判断的节点,而tree2还有为比较的节点
if (tree1 == null) {
return false;
}
// 此时tree1和tree2两颗树相同节点的值不相同,说明tree2不是tree1的子结构
if (tree1.val != tree2.val) {
return false;
}
// 继续判断当前节点的左子树和右子树是否相等
return isSub(tree1.left, tree2.left) && isSub(tree1.right, tree2.right);
}
public static void main(String[] args) {
TreeNode root1 = buildTree1();
TreeNode root2 = buildTree2();
boolean result = hasSub(root1, root2);
// true
System.out.println(result);
root2 = buildTree3();
result = hasSub(root1, root2);
// false
System.out.println(result);
}
/**
* 创建tree1:</br>
* 5</br>
* 3 18</br>
* @return
*/
private static TreeNode buildTree1(){
TreeNode root = new TreeNode(5);
TreeNode left = new TreeNode(3);
TreeNode right = new TreeNode(18);
root.left = left;
root.right = right;
return root;
}
/**
* 创建tree2:</br>
* 5</br>
* 3</br>
* @return
*/
private static TreeNode buildTree2(){
TreeNode root = new TreeNode(5);
TreeNode left = new TreeNode(3);
root.left = left;
return root;
}
/**
* 创建tree3:</br>
* 4</br>
* @return
*/
private static TreeNode buildTree3(){
TreeNode root = new TreeNode(4);
return root;
}