经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » PHP » 查看文章
[PHP] 算法-二叉树的子结构判断的PHP实现
来源:cnblogs  作者:陶士涵  时间:2018/9/30 11:03:03  对本文有异议
  1. 输入两棵二叉树AB,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
  2. 1.子树的意思是包含了一个节点,就得包含这个节点下的所有节点,两棵树同时到底
  3. 2.子结构可以是A树的任意一部分
  4. 思路:
  5. 1.第一个递归:AB两棵树,先在A中找到与B的根结点相同的点,如果A的根不是,那就递归A的左右子树来找
  6. 2.第二个递归:从两棵树的根结点开始进行比较,遍历的过程中,如果B树为空,则返回true;如果B不为空,A为空,返回false
  7. A树的结点值与B树的不同,返回false;
  8. 短路运算符&& ,递归A的左子树,B的左子树;递归A的右子树,B的右子树
  9. HasSubtree(treeA,treeB)
  10. if(treeA->val==treeB->val)//根结点相同
  11. res=tree1HasTreeB(treeA.treeB)
  12. if !res
  13. res=HasSubtree(treeA->left.treeB)//第一层遍历
  14. if !res
  15. res=HasSubtree(treeA->right.treeB)//第一层遍历
  16. return res
  17. tree1HasTreeB(treeA,treeB)
  18. //顺序不能变
  19. if treeB==null //B到底的时候,就是true
  20. return true
  21. if treeA==null
  22. return false//B没到底,A到底了,就是false
  23. if treeA->val!=treeB->val //A和B的结点没对上
  24. return false
  25. //短路语法 ,如果前面的是false,直接返回false,后面不用走
  26. return tree1HasTreeB(treeA->left,treeB->left)&&tree1HasTreeB(treeA->right,treeB->right)

 

  1. <?php
  2. class TreeNode{
  3. public $val;
  4. public $left = NULL;
  5. public $right = NULL;
  6. public function __construct($val){
  7. $this->val = $val;
  8. }
  9. }
  10. //构造两棵树
  11. $node1=new TreeNode(1);
  12. $node2=new TreeNode(2);
  13. $node3=new TreeNode(3);
  14. $node4=new TreeNode(4);
  15. $node5=new TreeNode(5);
  16. $treeA=$node1;
  17. $node1->left=$node2;
  18. $node1->right=$node3;
  19. $node3->left=$node4;
  20. $node3->right=$node5;
  21. //var_dump($treeA);
  22.  
  23. $node6=new TreeNode(3);
  24. $node7=new TreeNode(4);
  25. $node6->left=$node7;
  26. $treeB=$node6;
  27. //var_dump($treeB);
  28.  
  29. function HasSubtree($pRoot1,$pRoot2){
  30. $res=false;
  31. if($pRoot1==null || $pRoot2==null) return $res;
  32. if($pRoot1->val==$pRoot2->val) $res=tree1HasTree2($pRoot1,$pRoot2);
  33. if(!$res) $res=HasSubtree($pRoot1->left,$pRoot2);
  34. if(!$res) $res=HasSubtree($pRoot1->right,$pRoot2);
  35. return $res;
  36. }
  37. function tree1HasTree2($treeA,$treeB){
  38. if($treeB==null) return true;
  39. if($treeA==null) return false;
  40. if($treeA->val!=$treeB->val) return false;
  41. return tree1HasTree2($treeA->left,$treeB->left)&&tree1HasTree2($treeA->right,$treeB->right);
  42. }
  43. var_dump(HasSubtree($treeA,$treeB));

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号