欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

[PHP] 算法-二叉树的子结构判断的PHP实现

程序员文章站 2023-09-28 17:01:53
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 1.子树的意思是包含了一个节点,就得包含这个节点下的所有节点,两棵树同时到底 2.子结构可以是A树的任意一部分 思路: 1.第一个递归:A和B两棵树,先在A中找到与B的根结点相同的点,如果A的根不是,那就递归... ......
输入两棵二叉树a,b,判断b是不是a的子结构。(ps:我们约定空树不是任意一个树的子结构)
1.子树的意思是包含了一个节点,就得包含这个节点下的所有节点,两棵树同时到底
2.子结构可以是a树的任意一部分


思路:
1.第一个递归:a和b两棵树,先在a中找到与b的根结点相同的点,如果a的根不是,那就递归a的左右子树来找
2.第二个递归:从两棵树的根结点开始进行比较,遍历的过程中,如果b树为空,则返回true;如果b不为空,a为空,返回false
              a树的结点值与b树的不同,返回false;
              短路运算符&& ,递归a的左子树,b的左子树;递归a的右子树,b的右子树

hassubtree(treea,treeb)
    if(treea->val==treeb->val)//根结点相同
        res=tree1hastreeb(treea.treeb)
    if !res
        res=hassubtree(treea->left.treeb)//第一层遍历
    if !res
        res=hassubtree(treea->right.treeb)//第一层遍历
    return res
tree1hastreeb(treea,treeb)
    //顺序不能变
    if treeb==null  //b到底的时候,就是true
        return true
    if treea==null
        return false//b没到底,a到底了,就是false
    if treea->val!=treeb->val //a和b的结点没对上
        return false
    //短路语法 ,如果前面的是false,直接返回false,后面不用走
    return tree1hastreeb(treea->left,treeb->left)&&tree1hastreeb(treea->right,treeb->right)

 

<?php
class treenode{
    public $val;
    public $left = null;
    public $right = null;
    public function __construct($val){
        $this->val = $val;
    }   
}


//构造两棵树
$node1=new treenode(1);
$node2=new treenode(2);
$node3=new treenode(3);
$node4=new treenode(4);
$node5=new treenode(5);


$treea=$node1;
$node1->left=$node2;
$node1->right=$node3;
$node3->left=$node4;
$node3->right=$node5;

//var_dump($treea);

$node6=new treenode(3);
$node7=new treenode(4);
$node6->left=$node7;
$treeb=$node6;
//var_dump($treeb);

function hassubtree($proot1,$proot2){
        $res=false;
        if($proot1==null || $proot2==null) return $res;
        if($proot1->val==$proot2->val) $res=tree1hastree2($proot1,$proot2);
        if(!$res) $res=hassubtree($proot1->left,$proot2);
        if(!$res) $res=hassubtree($proot1->right,$proot2);
        return $res;
}
function tree1hastree2($treea,$treeb){
        if($treeb==null) return true;
        if($treea==null) return false;
        if($treea->val!=$treeb->val) return false;
        return tree1hastree2($treea->left,$treeb->left)&&tree1hastree2($treea->right,$treeb->right);
}
var_dump(hassubtree($treea,$treeb));