您的位置:首页 > 职场人生

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

2017-08-23 15:12 573 查看
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;

public TreeNode(int val) {
this.val = val;

}

}
*/
import java.util.LinkedList;
public class Solution
{
public boolean HasSubtree(TreeNode root1,TreeNode root2)
{
if(root1==null||root2==null)
return false;
else//都不为空的情况下
{
//由于找到在A树(root1为根节点)找到的与B树根节点相同的节点不一定就一个,利用广度优先遍历进行遍历搜索
LinkedList<TreeNode> list=new LinkedList<TreeNode>();
list.add(root1);
while(!list.isEmpty())
{
TreeNode temp=isContain(list.poll(),root2);
if(temp!=null)
{
if(find(temp,root2))
{

return true;
}
else
{
if(temp.left!=null)
list.add(temp.left);
if(temp.right!=null)
list.add(temp.right);
}

}
}
return false;
}
}
//root1为在Tree1中值与root2相同的节点,判断以root2为根节点的树是不是和root1中的部分完全对应
public static boolean find(TreeNode root1,TreeNode root2)
{
LinkedList<TreeNode> list1=new LinkedList<TreeNode>();
LinkedList<TreeNode> list2=new LinkedList<TreeNode>();
list1.add(root1);
list2.add(root2);
while(!list2.isEmpty())
{
TreeNode temp1=list1.poll();//从队列头移除元素
TreeNode temp2=list2.poll();//从队列头移除元素
if(temp1.val==temp2.val)//节点值相等就继续找左右子节点
{
if(temp1.left!=null&&temp2.left!=null)  //同时为空或同时不为空
{
list1.add(temp1.left);
list2.add(temp2.left);
}
else if(temp1.left==null&&temp2.left==null){}
else if(temp2.left==null&&temp1.left!=null){}
else
return false;
if(temp1.right!=null&&temp2.right!=null)
{
list1.add(temp1.right);
list2.add(temp2.right);
}
else if(temp1.right==null&&temp2.right==null){}
else if(temp2.right==null&&temp1.right!=null){}
else
return false;

}
else
{
return false;
}
}
return true;

}
public static TreeNode isContain(TreeNode root1,TreeNode root2)//广度优先遍历找到从root1节点开始向下的第一个值与root2相同的节点
{
LinkedList<TreeNode> list=new LinkedList<TreeNode>();
list.add(root1);
TreeNode result=null;
while(!list.isEmpty())
{
TreeNode temp=list.poll();//从队列头移除元素
if(temp.val==root2.val)//找到与其根节点相同的节点
{
result=temp;
break;
}
else
{
if(temp.left!=null)
list.add(temp.left);
if(temp.right!=null)
list.add(temp.right);
}
}
return result;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 面试题
相关文章推荐