輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)
前面曾經做過根據中序和前序的訪問順序,重新構建二叉樹,所以根據中序和前序同樣可以確定一個二叉樹。當時是遞歸的構建。將構建的過程反過來。確定一個二叉樹是不是另一個二叉樹的子樹可以分別進行前序和中序便利,如果一個樹的前序和中序的遍歷的子序列分別包含了另一個樹的前序和中序的訪問,那么后者一定是前者的子樹。
class TreeNode{
var $val;
var $left = NULL;
var $right = NULL;
function __construct($val){
$this->val = $val;
}
}
$pre_root1 = array();
$pre_root2 = array();
$in_root1 = array();
$in_root2 = array();
function HasSubtree($pRoot1, $pRoot2)
{
GLOBAL $pre_root1;
GLOBAL $pre_root2;
GLOBAL $in_root1;
GLOBAL $in_root2;
preOrder($pRoot1,$pre_root1);
preOrder($pRoot2,$pre_root2);
inOrder($pRoot1,$in_root1);
inOrder($pRoot2,$in_root2);
$pre_root1_str = implode('',$pre_root1);
$pre_root2_str = implode('',$pre_root2);
$in_root1_str = implode('',$in_root1);
$in_root2_str = implode('',$in_root2);
if(strpos($pre_root1_str,$pre_root2_str)!==false && strpos($in_root1_str,$in_root2_str)!==false){
return true;
}
else{
return false;
}
}
function preOrder($root,&$arr){
if($root==null){
return ;
}
else{
$arr[] = $root->val;
preOrder($root->left, $arr);
preOrder($root->right, $arr);
}
}
function inOrder($root,&$arr){
if($root==null){
return;
}
else{
inOrder($root->left, $arr);
$arr[] = $root->val;
inOrder($root->right, $arr);
}
}
$root1 = new TreeNode(8);
$root1->left = new TreeNode(8);
$root1->right = new TreeNode(7);
$root1->left->left = new TreeNode(9);
$root1->left->right = new TreeNode(2);
$root2 = new TreeNode(8);
$root2->left = new TreeNode(9);
$root2->right = new TreeNode(2);
echo HasSubtree($root1, $root2);
這樣是判斷是否是子樹,而不是子結構,子結構和子樹是有區別的,子結構的范圍要廣。
因為樹本身是一種遞歸結構,所以可以考慮遞歸的比較。判斷是否為子結構的時候非常方便的,可以通過遞歸 的方式逐次比較,判斷是不是子結構,同樣可以遞歸的比較。
function HasSubtree($pRoot1, $pRoot2)
{
if($pRoot1==null&&$pRoot2!=null){//p1的范圍小于p2
return false;
}
if ($pRoot2==null){//空樹不是任意一個樹的子結構
return false;
}
$flag |= isEqualStruct($pRoot1, $pRoot2);
if ($flag) {
return $flag;
}
$flag |= HasSubtree($pRoot1->left, $pRoot2);
if ($flag) {
return $flag;
}
$flag |= HasSubtree($pRoot1->right, $pRoot2);
return $flag;
}
//判斷結構相同,而不是判斷樹相同
function isEqualStruct($pRoot1,$pRoot2){
$flag = true;
if ($pRoot2==null){//p2為空,說明p1的范圍大于等于p2
return true;
}else if($pRoot1!=null&&$pRoot2!=null){//都不為空接著比較,直到比較出不同。
if ($pRoot1->val==$pRoot2->val){//對應節點上的值相同進一步比較
if($flag==true){
$flag &= isEqualStruct($pRoot1->left,$pRoot2->left);
}
if($flag==true){
$flag &= isEqualStruct($pRoot1->right,$pRoot2->right);
}
}else{//值不相同就可以返回假了
return false;
}
}else{//這里是p1等于空,但是p2不等于空的情況說明p2的范圍要大于p1,p2不是p1的子結構。
return false;
}
return $flag;
}
題目描述
操作給定的二叉樹,將其變換為源二叉樹的鏡像。
輸入描述:
二叉樹的鏡像定義:源二叉樹
8
/
6 10
/ \ /
5 7 9 11
鏡像二叉樹
8
/
10 6
/ \ /
11 9 7 5
function Mirror(&$root)
{
if($root==NULL){
return;
}
$t = $root->left;
$root->left = $root->right;
$root->right = $t;
Mirror($root->left);
Mirror($root->right);
}
.