经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » PHP » 查看文章
[PHP] 算法-根据前序和中序遍历结果重建二叉树的PHP实现
来源:cnblogs  作者:陶士涵  时间:2018/9/27 16:49:58  对本文有异议
  1. 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
  2. 1.前序遍历是中,左,右;中序遍历是左,中,右
  3. 2.前序遍历的第一个是根结点,中序遍历数组中从开始到根结点的所有是左子树,可以知道左子树的个数,根结点右边的是右子树
  4. 3.前序遍历除去0位置的,从1到左子树个数位置是左子树,其他的是右子树
  5. 4.确定四个数组,前序左子树数组,前序右子树数组,中序左子树数组,中序右子树数组;递归调用
  6. reConstructBinaryTree(pre,in)
  7. if(pre.length) return null//递归终止条件
  8. root=pre[0]
  9. Node=new Node(root)
  10. //在中序中找根结点的位置
  11. p=0
  12. for p;p<pre.length;p++
  13. if in[p]==root break
  14. for i=0;i<pre.length;i++
  15. if i<p
  16. //中序左子树数组
  17. inLeft[]=in[i]
  18. //前序左子树数组
  19. preLeft[]=pre[i+1]
  20. else if i>p
  21. //中序的右子树
  22. inRight[]=in[i]
  23. //前序的右子树
  24. preRight[]=pre[i]
  25. Node->left=reConstructBinaryTree(preLeft,inLeft)
  26. Node->right=reConstructBinaryTree(preRight,inRight)
  27. return Node
  1. <?php
  2. class TreeNode{
  3. var $val;
  4. var $left = NULL;
  5. var $right = NULL;
  6. function __construct($val){
  7. $this->val = $val;
  8. }
  9. };
  10. function reConstructBinaryTree($pre, $vin){
  11. $len=count($pre);
  12. if($len==0){
  13. return null;
  14. }
  15. $root=$pre[0];
  16. $node=new TreeNode($root);
  17. for($p=0;$p<$len;$p++){
  18. if($vin[$p]==$root){
  19. break;
  20. }
  21. }
  22. $preLeft=array();
  23. $preRight=array();
  24. $vinLeft=array();
  25. $vinRight=array();
  26. for($i=0;$i<$len;$i++){
  27. if($i<$p){
  28. $preLeft[]=$pre[$i+1];
  29. $vinLeft[]=$vin[$i];
  30. }else if($i>$p){
  31. $preRight[]=$pre[$i];
  32. $vinRight[]=$vin[$i];
  33. }
  34. }
  35. $node->left=reConstructBinaryTree($preLeft,$vinLeft);
  36. $node->right=reConstructBinaryTree($preRight,$vinRight);
  37. return $node;
  38. }
  39. $pre=array(1,2,4,7,3,5,6,8);
  40. $vin=array(4,7,2,1,5,3,8,6);
  41. $node=reConstructBinaryTree($pre,$vin);;
  42. var_dump($node);
  1. object(TreeNode)#1 (3) {
  2. ["val"]=>
  3. int(1)
  4. ["left"]=>
  5. object(TreeNode)#2 (3) {
  6. ["val"]=>
  7. int(2)
  8. ["left"]=>
  9. object(TreeNode)#3 (3) {
  10. ["val"]=>
  11. int(4)
  12. ["left"]=>
  13. NULL
  14. ["right"]=>
  15. object(TreeNode)#4 (3) {
  16. ["val"]=>
  17. int(7)
  18. ["left"]=>
  19. NULL
  20. ["right"]=>
  21. NULL
  22. }
  23. }
  24. ["right"]=>
  25. NULL
  26. }
  27. ["right"]=>
  28. object(TreeNode)#5 (3) {
  29. ["val"]=>
  30. int(3)
  31. ["left"]=>
  32. object(TreeNode)#6 (3) {
  33. ["val"]=>
  34. int(5)
  35. ["left"]=>
  36. NULL
  37. ["right"]=>
  38. NULL
  39. }
  40. ["right"]=>
  41. object(TreeNode)#7 (3) {
  42. ["val"]=>
  43. int(6)
  44. ["left"]=>
  45. object(TreeNode)#8 (3) {
  46. ["val"]=>
  47. int(8)
  48. ["left"]=>
  49. NULL
  50. ["right"]=>
  51. NULL
  52. }
  53. ["right"]=>
  54. NULL
  55. }
  56. }
  57. }

 

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

本站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号