PHP 一个树为另一棵树的子结构 [TO BE CONTINUED]
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
<?php
class TreeNode {
private $val;
private $left;
private $right; public function __construct($val=null, $left = null, $right = null) {
$this->val = $val;
$this->left = $left;
$this->right = $right;
} /**
* @param $x : val
* @param $t TreeNode or: null
*/
public function insert($x) {
if ($this->val ===null) {
$this->val = $x;
}
if ($x < $this->val) {
$this->left = is_null($this->left) ? new self($x) :
$this->left->insert($x);
} else if ($x > $this->val) {
$this->right = is_null($this->right) ? new self($x):
$this->right->insert($x);
}
/* else x is in the tree already; we'll do nothing */
return $this;
} /**
* 先序遍历
* @param $callback
*/
public function traversePre($callback) {
if (is_null($this->val)) {
return;
}
call_user_func($callback, $this->val);
if (!is_null($this->left)) {
$this->left->traversePre($callback);
}
if (!is_null($this->right)) {
$this->right->traversePre($callback);
}
} /**
* 中序遍历
* @param $callback
*/
public function traverseMid($callback) {
if (is_null($this->val)) {
return;
}
if (!is_null($this->left)) {
$this->left->traverseMid($callback);
}
call_user_func($callback, $this->val);
if (!is_null($this->right)) {
$this->right->traverseMid($callback);
}
} /**
* @return null
*/
public function makeEmpty() {
if ($this->left !== null) {
$this->left->makeEmpty();
unset($this->left);
}
if ($this->right !== null) {
$this->right->makeEmpty();
unset($this->right);
}
$this->val = null;
return null;
} /**
* fixme: find(7) => find(11)?
* @return null
*/
public function find($x) {
if ($this->val===null) {
return null;
}
return ($x < $this->val) ? (is_null($this->left) ? null : $this->left->find($x)) :
($x > $this->val) ? (is_null($this->right) ? null: $this->right->find($x)) : $this;
} /**
* 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
* @param $pRoot1
* @param $pRoot2
* @return bool
*/
public static function HasSubtree($pRoot1, $pRoot2) {
if ($pRoot2 === null || $pRoot1===null) {
return false;
}
if ($pRoot1->val===$pRoot2->val) {
return self::isSubTree($pRoot1, $pRoot2) ||
self::isSubTree($pRoot1->left, $pRoot2) || self::isSubTree($pRoot1->right, $pRoot2);
}
return false;
} private static function isSubTree($root1, $root2) {
if ($root2===null) {return true;}
if ($root1 === null) {return false;}
if ($root1->val === $root2->val) {
return self::isSubTree($root1->left, $root2->left) && self::isSubTree($root1->right, $root2->right);
}
return false;
} }
test:
/**
8
/ \
6 10
/ \ / \
5 7 9 11
*/ $tree = new TreeNode(); $a = [8,6,10,5,7,9,11];
array_walk($a, function($value, $index, $tree) {
$tree->insert($value);
}, $tree); $tree->traversePre(function($elem) {echo $elem.',';});
echo PHP_EOL;
$tree->traverseMid(function($elem) {echo $elem.',';});
echo PHP_EOL;
var_dump($tree->find(7));
// $tree->makeEmpty();
PHP 一个树为另一棵树的子结构 [TO BE CONTINUED]的更多相关文章
- [LeetCode]Subtree of Another Tree判断一棵树是不是另一棵树的子树
将树序列化为字符串,空节点用符号表示,这样可以唯一的表示一棵树. 用list记录所有子树的序列化,和目标树比较. List<String> list = new ArrayList< ...
- 判断一棵树是否为二叉搜索树(二叉排序树) python
输入一棵树,判断这棵树是否为二叉搜索树.首先要知道什么是排序二叉树,二叉排序树是这样定义的,二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的 ...
- 011-数据结构-树形结构-B+树[mysql应用]、B*树
一.B+树概述 B+树是B树的变种,有着比B树更高的查询效率. 一棵 B+ 树需要满足以下条件: 节点的子树数和关键字数相同(B 树是关键字数比子树数少一) 节点的关键字表示的是子树中的最大数,在子树 ...
- hdu6035 Colorful Tree 树形dp 给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。
/** 题目:hdu6035 Colorful Tree 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6035 题意:给定一棵树,每个节点有一个颜色值.定 ...
- 小希的迷宫(MST单棵树判断法则)
小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- 2017年陕西省网络空间安全技术大赛——种棵树吧——Writeup
2017年陕西省网络空间安全技术大赛——种棵树吧——Writeup 下载下来的zip解压得到两个jpg图片,在Kali中使用binwalk查看文件类型如下图: 有两个发现: 1111.jpg 隐藏了一 ...
- bzoj 2816: [ZJOI2012]网络 (LCT 建多棵树)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2816 题面: http://www.lydsy.com/JudgeOnline/upload ...
- 如何打印一棵树(Java)
1.有一棵多叉树,将它打印出来. import java.util.LinkedList; /** * 需求:按层打印一棵树 * 说明:树是保存在一个链表中 * created by wangjunf ...
- Codeforces - 828E DNA Evolution —— 很多棵树状数组
题目链接:http://codeforces.com/contest/828/problem/E E. DNA Evolution time limit per test 2 seconds memo ...
随机推荐
- C#中使用WavHelper保存录音数据为wav文件
C#将录音数据文件保存为wav格式文件,这里使用到的是WavHelper工具类. WavHelper工具类: using System; using System.Collections.Generi ...
- 14.SpringMVC之文件上传下载
SpringMVC通过MultipartResolver(多部件解析器)对象实现对文件上传的支持. MultipartResolver是一个接口对象,需要通过它的实现类CommonsMultipart ...
- 12.SpringMVC之拦截器
1.拦截器概述 1.1 什么是拦截器? Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理.例如通过拦截器可以 ...
- css - rem和vw
css - rem和vw 物理像素 物理像素在不同的设备中1px里可以容纳的像素颗粒是不相同的,所以1px这个单位其实也是有N个像素颗粒填充的.同一尺寸屏幕的每个像素点所能容纳的像素颗粒越多显示效果越 ...
- Windows系统搭建Redis集群三种模式(零坑、最新版)
目录 主从复制 修改配置文件 启动各节点 验证 哨兵模式 修改配置文件 启动实例 验证 集群模式 修改配置文件 启动实例 验证 主从复制 新建以下三个目录,用来部署一主二从 redis 的安装在另外一 ...
- Swing常用容器
3.Swing(AWT的子类) 3.1窗口.面板 public class myJFrame extends JFrame { //JFrame是一个顶级窗口 public myJFrame() { ...
- Python实现Thrift Server
近期在项目中存在跨编程语言协作的需求,使用到了Thrift.本文将记录用python实现Thrift服务端的方法. 环境准备 根据自身实际情况下载对应的Thrift编译器,比如我在Windows系统上 ...
- AWS使用ALB负载均衡遇到的问题
文章原文 问题描述 ALB 负载均衡 RGC-Dev-ALB.xxx.cn-north-1.elb.amazonaws.com.cn 解析到2个IP 54.223.xxx.xx和52.81.xxx.x ...
- Django——实现最基础的评论功能(只有一级评论)
我对评论功能的理解: --------(1)数据库建一个评论的表 --------(2)前端建一个提交评论的form表单 --------(3)表单提交评论内容后写入到数据库评论表中 -------- ...
- IKEv2协议关键知识点总结整理
文章目录 @[toc] 1. IKEv2基本原理 2. IKEv2协议重点注意事项 2.1 情景一:==IKEv2协商密钥逻辑== ①密钥协商流程 ②函数调用关系 ③流程简述 2.2 情景二:==使用 ...