题目描述
输入两颗二叉树A,B,判断B是不是A的子结构。
分析
有关树的操作一般是通过递归遍历来实现的。
牛客AC代码:
/**
* 输入两颗二叉树A,B,判断B是不是A的子结构。
*
* @param root1
* @param root2
* @return
*/
public boolean HasSubtree(TreeNode root1, TreeNode root2) {
if (root1 == null || root2 == null)
return false;
// 先从树A的根节点开始判断,如果不成立,则分别递归判断树A的左右子树
return isSubTree(root1, root2) ||
HasSubtree(root1.left, root2) ||
HasSubtree(root1.right, root2);
}
public boolean isSubTree(TreeNode root1, TreeNode root2) {
// 此处必须先判断root是否为空,否则无法通过所有用例
if (root2 == null)
return true;
if (root1 == null)
return false;
if (root1.val != root2.val)
return false;
// 对应的左右节点的值必须完全相等
return isSubTree(root1.left, root2.left) && isSubTree(root1.right, root2.right);
}
相关问题扩展
百度2016实习笔试:输入两颗二叉树A,B,判断B是不是A的严格子结构。注意严格子结构值得是左子树或右子树中的结构。是则返回1,否则返回-1。
详见文章: 百度2016实习笔试:判断二叉树B是否是A的子结构
参考
1. 何海涛,剑指offer名企面试官精讲典型编程题(纪念版),电子工业出版社