《剑指Offer》-26.树的子结构

题干

输入两棵二叉树A和B,判断B是不是A的子结构。二叉树节点定义如下:

class TreeNode{
    double value;
    TreeNode left;
    TreeNode right;
}

二叉树A

graph TD
6-->8
8-->9
6-->7
8-->2
2-->4
4-->5

二叉树B

graph TD
8-->9
8-->2

解题思路

获取B的根节点,遍历A中是否存在等于B的根节点的节点,不存在,则返回false, 存在则判断该节点的子树是否与B的结构相同,相同则返回true,不同则继续查找下一个与B的根节点相同的节点,重复上面的操作。

代码实现

<?php

class TreeNode
{
    private $val;
    private $left;
    private $right;

    public function __set($name, $value)
    {
        $this->$name = $value;
    }

    public function __get($name)
    {
        return $this->$name;
    }
}

function getTree1()
{
    $node1 = new TreeNode();
    $node1->val = 6;
    $node2 = new TreeNode();
    $node2->val = 7;
    $node3 = new TreeNode();
    $node3->val = 8;
    $node1->left = $node2;
    $node1->right = $node3;
    $node4 = new TreeNode();
    $node4->val = 2;
    $node5 = new TreeNode();
    $node5->val = 9;
    $node3->left = $node4;
    $node3->right = $node5;
    $node6 = new TreeNode();
    $node6->val = 4;
    $node4->left = $node6;
    $node7 = new TreeNode();
    $node7->val = 5;
    $node6->left = $node7;

    return $node1;
}

function getTree2()
{
    $node1 = new TreeNode();
    $node1->val = 8;
    $node2 = new TreeNode();
    $node2->val = 2;
    $node3 = new TreeNode();
    $node3->val = 9;
    $node1->left = $node2;
    $node1->right = $node3;

    return $node1;
}

function hasSubTree($tree1, $tree2)
{
    $result = false;
    if ($tree1 != null && $tree2 != null) {
        if (isEqual($tree1->val, $tree2->val)) {
            $result = doesTree1HaveTree2($tree1, $tree2);
        }
        if (!$result) {
            $result = hasSubTree($tree1->left, $tree2);
        }
        if (!$result) {
            $result = hasSubTree($tree1->right, $tree2);
        }
    }

    return $result;
}

function isEqual($val1, $val2)
{
    return ($val1 - $val2 > -10e-7) && ($val1 - $val2 < 10e-7);
}

function doesTree1HaveTree2($tree1, $tree2)
{
    if ($tree2 == null) {
        return true;
    }
    if ($tree1 == null) {
        return false;
    }
    if (!isEqual($tree1->val, $tree2->val)) {
        return false;
    }

    return doesTree1HaveTree2($tree1->left, $tree2->left) && doesTree1HaveTree2($tree1->right, $tree2->right);
}

$tree1 = getTree1();
$tree2 = getTree2();
var_dump(hasSubTree($tree1, $tree2));
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 10,946评论 0 13
  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 4,864评论 1 31
  • 1.7:30起床。 2.早餐,酵素枸杞水,阿华田麦片。
    柒云氿上阅读 200评论 0 0
  • 佛陀与弟子们入舍卫城乞食,正好遇见怀恨佛陀的人,于是这个人立即大声和街上的行人谈论许多有关佛陀的恶行。其中一位弟子...
    海洋深深阅读 945评论 0 1
  • 《寓言》是王菲发行于2000年的专辑,至今在豆瓣保持着9.6的高分。专辑里《寒武纪》、《新房客》、《香奈儿》、《阿...
    小朱熊Magneto阅读 9,071评论 0 3

友情链接更多精彩内容