[PHP] 算法-二叉树的子结构判断的PHP实现
- 输入两棵二叉树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));
[PHP] 算法-二叉树的子结构判断的PHP实现的更多相关文章
- 剑指OFFER(百度笔试)——二叉树的子结构
百度软件开发实习生笔试: 1.模拟短作业优先调度算法,计算平均等待时间,例如输入[0,2,4,8]表示四个作业分别是第0s到.第2s到.第4s到.第8s到.[2,1,6,3]表示四个作业的运行时间. ...
- javascript数据结构与算法-- 二叉树
javascript数据结构与算法-- 二叉树 树是计算机科学中经常用到的一种数据结构.树是一种非线性的数据结构,以分成的方式存储数据,树被用来存储具有层级关系的数据,比如文件系统的文件,树还被用来存 ...
- javascript数据结构与算法---二叉树(删除节点)
javascript数据结构与算法---二叉树(删除节点) function Node(data,left,right) { this.data = data; this.left = left; t ...
- javascript数据结构与算法---二叉树(查找最小值、最大值、给定值)
javascript数据结构与算法---二叉树(查找最小值.最大值.给定值) function Node(data,left,right) { this.data = data; this.left ...
- javascript数据结构与算法--二叉树遍历(后序)
javascript数据结构与算法--二叉树遍历(后序) 后序遍历先访问叶子节点,从左子树到右子树,再到根节点. /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * * * */ ...
- javascript数据结构与算法--二叉树遍历(先序)
javascript数据结构与算法--二叉树遍历(先序) 先序遍历先访问根节点, 然后以同样方式访问左子树和右子树 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...
- javascript数据结构与算法--二叉树遍历(中序)
javascript数据结构与算法--二叉树遍历(中序) 中序遍历按照节点上的键值,以升序访问BST上的所有节点 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...
- Java数据结构和算法 - 二叉树
前言 数据结构可划分为线性结构.树型结构和图型结构三大类.前面几篇讨论了数组.栈和队列.链表都是线性结构.树型结构中每个结点只允许有一个直接前驱结点,但允许有一个以上直接后驱结点.树型结构有树和二叉树 ...
- 【剑指offer】二叉树的子结构,C++实现(递归)
原创博文,转载请注明出处! <牛客链接> 1.题目 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:约定空树不是任意一个树的子结构) 图1.二叉树A和二叉树B 2.思路(递归) ...
随机推荐
- Codeforces Round #485 (Div. 2) A. Infinity Gauntlet
Codeforces Round #485 (Div. 2) A. Infinity Gauntlet 题目连接: http://codeforces.com/contest/987/problem/ ...
- Raft知识图谱
- 轮播图js编写
//面向对象 function Left() { this.index = 0; this.lefthover = $('#left-content'); this.listenhover(); th ...
- Docker基础-使用Dockerfile创建镜像
1.基本结构 Dockerfile由一行行命令语句组成,并支持以#开头的注释行.例如: # This dockerfile uses the ubuntu image # VERSION 2 - ED ...
- Coding能力提升小技巧
一.使用变量的一般原则 1.变量初始化原则: 通常在变量声明时初始化; 在靠近变量第一次使用的位置初始化; 在类的构造函数里初始化变量. 2.作用域: 使变量引用局部化,即把引用到变量的地方尽可能集中 ...
- 《深入理解JAVA虚拟机》——学习笔记
JVM内存模型以及分区 JVM内存分为: 1.方法区:线程共享的区域,存储已经被虚拟机加载的类信息.常量.静态变量.即时编译器编译后的代码等数据 2.堆:线程共享的区域,存储对象实例,以及给数组分配的 ...
- Android 音乐(音效)播放方式总结
一.音效的分类 音效按照作用的不同,可以将音效分为即时音效和背景音乐.两种音效在Android中的实现技术是不同的. 主要的实现方式为:SoundPool.MediaPlayer. 区别在于,Medi ...
- Javascript高级编程学习笔记(3)—— JS中的数据类型(1)
前一段时间由于事情比较多,所以笔记耽搁了一段时间,从这一篇开始我会尽快写完这个系列. 文章中有什么不足之处,还望各位大佬指出. JS中的数据类型 上一篇中我写了有关JS引入的Script标签相关的东西 ...
- Netty 发送消息失败或者接收消息失败的可能原因
1. 消息发送失败: 检查通道是否建立成功 Netty中的通道建立采用的是异步方式,获取到的通道对象可能为空或初始化未完成: 2. 接收的消息有丢失 消息可能会粘包,是否有拆包机制
- Linux 后台运行命令:nohup 和 &
[参开文章]:nohup 与 & 的区别 1. nohup 1.1 基本概念 将程序以忽略挂起信号的方式运行起来: 不可以免疫 Ctrl + C 的 SIGINT 中断信号: 可以免疫 SI ...