[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.思路(递归) ...
随机推荐
- s6-2 UDP
User Datagram Protocol UDP 是一个无连接的(connectionless)的传输层协议 UDP传输数据段,无须建立连接 UDP 在 RFC 768中描述 很多 ...
- Android系统的镜像文件的打包过程
在前面一篇文章中,我们分析了Android模块的编译过程.当Android系统的所有模块都编译好之后,我们就可以对编译出来的模块文件进行打包了.打包结果是获得一系列的镜像文件,例如system.img ...
- ScriptOJ-safeGet#99
const safeGet = (data, path) => { if(!path) return undefined; const pathArr = path.split('.'); le ...
- 浅析软件工程中的UML建模技术
一.基本信息 标题:浅析软件工程中的UML建模技术 时间:2018 出版源:电子世界 领域分类:软件工程:UML建模技术:需求分析 二.研究背景 问题定义:软件工程中UML建模技术的研究 难点:明确软 ...
- apache、nginx、tomcat配置方法
https://www.cnblogs.com/chenmh/p/5121830.html
- Codeforces Round #540 (Div. 3)--1118C - Palindromic Matrix
https://codeforces.com/contest/1118/problem/C 在查找元素的时候,必须按4,2,1的顺序进行.因为,如果先找1,可能就把原来的4拆散了,然后再找4,就找不到 ...
- noip第13课资料
- 剑指offer编程题Java实现——面试题14调整数组顺序使奇数位于偶数之前
题目: 输入一个整数数组,实现一个函数来调整该数组中数组的顺序,使得所有的奇数位于数组的前半部分,偶数位于数组的后半部分. 解题思路:数组中维护两个指针,第一个指针初始化时候指向数组头部,第二个指针初 ...
- 微信小程序scroll-view 横向和纵向scroll-view组件
scroll-view为滚动视图,分为水平滚动和垂直滚动.注意滚动视图垂直滚动时一定要设置高度否则的话scroll-view不会生效.滚动视图常用的地方一般都是Item项比较多的界面,比如我的模块 主 ...
- poj3280
将给定字符串用最小代价(添加,删除)变为回文串. dp:dp[i][j]表示将i-j变为回文串的最小代价. 若s[i]==s[j],则dp[i][j]=dp[i+1][j-1] 否则,若s[i+1]- ...