题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
树节点定义如下:
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
解题思路
- 先序遍历树A,如果某个节点与树B的根节点值相同,则对该子树进行子结构判断
import java.util.Stack;
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root1==null || root2==null)return false;
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode cur = root1;
while(cur!=null || !stack.isEmpty()){
while(cur != null){
if(root2.val == cur.val){
if(isSubTree(cur, root2))return true;
}
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
cur = cur.right;
}
return false;
}
private boolean isSubTree(TreeNode root1, TreeNode root2){
if(root2 == null)return true;
else if(root1 == null)return false;
if(root1.val != root2.val)return true;
return isSubTree(root1.left, root2.left) && isSubTree(root1.right, root2.right);
}
}
- 递归的方式,更加简洁。
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root1==null || root2==null)return false;
boolean flag = false;
if(root1.val == root2.val){
flag = isSubTree(root1, root2);
}
//左子树中寻找
if(!flag)flag = HasSubtree(root1.left, root2);
//右子树中寻找
if(!flag)flag = HasSubtree(root1.right, root2);
return flag;
}
private boolean isSubTree(TreeNode root1, TreeNode root2){
if(root2 == null)return true;
else if(root1 == null)return false;
if(root1.val != root2.val)return false;
return isSubTree(root1.left, root2.left) && isSubTree(root1.right, root2.right);
}
}