题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路
这题里的子结构的意思是
故思路可以是:
1.先写一个函数compare(TreeNode root1,TreeNode root2),用来判断当root1.val==root2.val时,他们的左右子树是否都继续相等。即从根结点开始,比较两棵树对应结点的值,若全部相等(此时可以容许root1的树还有子节点,即上图中的6与7),则返回true。
2.遍历树A,当某一个结点的值等于B树根结点的值时,调用compare函数。若返回true,则B是A的子结构。
代码如下:
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.*;
/*
本题的子结构,可以是B的叶子结点对应的A的结点还有左右子树,也就是B在A中,而不是在最下层
*/
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
//题中已说明约定空树不是任意一个树的子结构
if(root1==null||root2==null) return false;
//这里用层次遍历,取A树的每个结点的val月root2.val比较,也可以用其他遍历方法
//或者用递归,只比较root1.val与root2.val,然后递归root1的左右子树与root2.val比较
Stack<TreeNode> s=new Stack<>();
s.push(root1);
while(!s.isEmpty()){
TreeNode t=s.pop();
if(t.val==root2.val&&compare(t,root2)) return true;
if(t.left!=null) s.push(t.left);
if(t.right!=null) s.push(t.right);
}
return false;
}
/*compare用来比较如果root1与root2的val相等时,这以这两个结点为根结点的树,B树是不是
A树的的子结构
*/
public boolean compare(TreeNode root1,TreeNode root2){
//如果B树遍历完了,就返回true
if(root2==null) return true;
//如果B数没遍历完,A树遍历完了,返回false
if(root1==null) return false;
//值不相等,返回false
if(root1.val!=root2.val) return false;
else{
return compare(root1.left,root2.left)&&compare(root1.right,root2.right);
}
}
}