面试常见基本题目总结及php实现(第二部分:二叉树遍历)
来源:互联网 发布:电脑硬盘坏了恢复数据 编辑:程序博客网 时间:2024/06/08 05:16
二叉树遍历主要有三种:先序遍历(根左右),中序遍历(左根右)和后序遍历(左右根),再加一个层次遍历(按层从左到右)
这三种方法又有递归和非递归的,递归的很简单,非递归的却很难。
递归:
先序:
<?phpfunction preorder($root){if($root!=null){print $root->val;preorder($root->left);preorder($root->right);}}?>中序:
<?phpfunction inorder($root){if($root!=null){inorder($root->left);print $root->val;inorder($root->right);}}?>后序:
<?phpfunction postorder($root){if($root!=null){postorder($root->left);postorder($root->right);print $root->val;}}?>非递归方法:
先序:
对于一个节点:1)输出该节点,将该节点入栈2)判断其左节点是否为空,若为空,则出栈,然后将右节点变成当前节点;若不为空,则将左节点变成当前节点。3)当节点为空,栈也为空时,结束遍历。
function preorder($root){$array=array();$p=$root;while($p!=null||count($array)!=0){while($p!=null){print $p->val;array_push($array,$p);$p=$p->left;}if(count($array)!=0){$p=$array[count($array)-1];array_pop($array);$p=$p->right;}}}中序:
对于一个节点:1)将该节点入栈。2)判断其左节点是否为空,若为空,则出栈,输出该节点,然后将右节点变成当前节点;若不为空,则将左节点变成当前节点。3)当节点为空,栈也为空时,结束遍历。
function inorder($root){$array=array();$p=$root;while($p!=null||count($array)!=0){while($p!=null){array_push($array,$p);$p=$p->left;}if(count($array)!=0){$p=$array[count($array)-1];print $p->val;array_pop($array);$p=$p->right;}}}后序:(最难!)
对于一个节点:1)将该节点入栈。2)判断其左节点和右节点是否为空,若为空,则出栈,输出该节点;若其中有一个不为空,但是输出过了,则输出该节点;若其中有一个不为空,但是没有输出过,则将右孩子和左孩子一次入栈,出栈的时候就可以保证左右根的顺序;栈顶作为下一个当前节点3)当节点为空,栈也为空时,结束遍历。
function postorder($root){$array=array();array_push($array,$root);$pre=null;while(count($array)!=0){$p=$array[count($array)-1];if(($p->left==null&&$p->right==null)||($pre!=null&&($pre==$p->left||$pre==$p->right))){print $p->val;array_pop($array);$pre=$p;}else{if($p->right!=null){array_push($array,$p->right);}if($p->left!=null){array_push($array,$p->left);}}}}
层次遍历
可以仿照层次遍历来获取二叉树的宽度,也就是二叉树每层的节点数最多的数量。
<?php$a=new TreeNode(1);$b=new TreeNode(2);$c=new TreeNode(3);$d=new TreeNode(4);$e=new TreeNode(5);$f=new TreeNode(6);$g=new TreeNode(7);$a->left=$b;$a->right=$c;$b->left=$d;$b->right=$e;$c->left=$f;//$c->right=$g;$d->right=$g;$array=array(array());levelorder($a,0,$array);for($i=0;$i<count($array);$i++){for($j=0;$j<count($array[$i]);$j++){print $array[$i][$j];}}class TreeNode{var $val;var $left=null;var $right=null;function __construct($x){$this->val=$x;}}function levelorder($root,$level,&$array){if($root!=null){$array[$level][]=$root->val;levelorder($root->left,$level+1,$array);levelorder($root->right,$level+1,$array);}}?>
阅读全文
0 0
- 面试常见基本题目总结及php实现(第二部分:二叉树遍历)
- 面试常见基本题目总结及php实现(第一部分:排序算法)
- 面试常见基本题目总结及php实现(第三部分:杂七杂八来一套)
- 关于二叉树遍历及二叉树面试题目
- BiTree 二叉树 基础算法及常见题目总结
- BiTree 二叉树 基础算法及常见题目总结
- 数据结构面试之五—二叉树的常见操作(递归实现部分)
- 数据结构面试之五—二叉树的常见操作(递归实现部分)
- 转 面试中的常见二叉树题目
- 二叉树遍历-面试常见题
- 常见面试题目总结
- 二叉树基本操作java实现及遍历浅析
- 面试中所有二叉树题目总结(java版)
- 面试中所有二叉树题目总结(java版)
- 二叉树相关面试题目总结
- 二叉树的面试题目总结
- 数据结构面试之五—二叉树的常见操作(递归实现部分
- spring基础知识汇总及常见面试题目总结
- [ASP.NET]自动发送邮件功能的实现
- Java基础面试题
- 十、shell printf命令:(格式化输出语句)
- oracle RAC RMAN自动备份脚本
- Netflix(奈飞)--SpringCloud
- 面试常见基本题目总结及php实现(第二部分:二叉树遍历)
- Java代码规范
- 二级列表ExpandableListView+gridview网络请求数据模拟商城展示
- MySql数据存储类型
- Django入门-0:为什么 Django 能持续统治 Python 开发世界
- exp和imp命令使用
- How to configure spacemacs on windows?
- spring注解 实现一个接口多个实现类的区分
- Java中的目录