<?php
/*class TreeNode{
var $val;
var $left = NULL;
var $right = NULL;
function __construct($val){
$this->val = $val;
}
}*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param pRoot1 TreeNode类
* @param pRoot2 TreeNode类
* @return bool布尔型
*/
function HasSubtree( $pRoot1 , $pRoot2 )
{
// write code here
if ($pRoot1 == null || $pRoot2 == null) return false;
if ($pRoot2->val == $pRoot1->val) {
if (isEqual($pRoot1, $pRoot2)) return true;
}
$e1 = HasSubtree($pRoot1->left, $pRoot2);
$e2 = HasSubtree($pRoot1->right, $pRoot2);
return $e1 || $e2;
}
function isEqual($pRoot1, $pRoot2) {
if ($pRoot2 == null) return true;
if ($pRoot1 == null) return false;
if ($pRoot1->val == $pRoot2->val) {
$e1 = isEqual($pRoot1->left, $pRoot2->left);
$e2 = isEqual($pRoot1->right, $pRoot2->right);
return $e1 && $e2;
} else {
return false;
}
}
参考大神的思路,在这自己写一下,方便复习:从A树的根节点开始,判断根节点值是否等于B树的根节点,如果是:那么就需要判断A树从当前节点起的子树是否和B树有相同的子结构,具体操作:用递归方法,每次先判断当前节点值A B树是否相等,如果不等,直接返回表明A树当前节点起没有和B树相同的子结构,如果相等,就判断A树的左子树是否和B树的左子树的结构是否相同,判断A树的右子树的结构是否和B树的右子树的结构相同,取这种两个子树判断结果的与运算值,递归结束的条件是B树遍历完;如果不是:就取A树的左子树或者右子树去寻找。时间复杂度是logn