二叉树的遍历算法:深度优先遍历和层次遍历【leetcode-144,102】PHP
2020/4/19 8:54:59
本文主要是介绍二叉树的遍历算法:深度优先遍历和层次遍历【leetcode-144,102】PHP,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
深度优先遍历
先序遍历:根->左->右
中序遍历:左->根->右
后序遍历:左->右->根
先序遍历
节点定义
class TreeNode { public $val = null; public $left = null; public $right = null; function __construct($value) { $this->val = $value; } }
思路
非递归先序遍历,使用栈结构
class Solution { /** * @param TreeNode $root * @return Integer[] */ function preorderTraversal($root) { if($root == null){ return []; } $res = []; $this->preorder($root, $res); return $res; } function preorder($root, &$res){ $stack = []; //先向栈中推入根节点 array_push($stack, $root); //判断栈中是否有元素,如果有进行遍历;没有元素,结束遍历。 while(!empty($stack)){ //取出栈中的一个元素 $root = array_pop($stack); //先序遍历,先根节点 $res[] = $root->val; //下面先右节点入栈,这样出栈时,先处理左节点 if($root->right != null){ array_push($stack, $root->right); } if($root->left != null){ array_push($stack, $root->left); } } } }
中序遍历
中序遍历的递归实现
class Solution { /** * @param TreeNode $root * @return Integer[] */ function inorderTraversal($root) { if($root == null){ return []; } $res = []; $this->inorder($root, $res); return $res; } function inorder($root, &$res){ if($root == null){ return ; } //先把左子树存入结果 if($root->left != null){ $this->inorder($root->left, $res); } $res[] = $root->val; if($root->right != null){ $this->inorder($root->right, $res); } } }
后序遍历
class Solution { public $res; /** * @param TreeNode $root * @return Integer[] */ function postorderTraversal($root) { if($root === null){ return []; } $this->_postOrder($root); return $this->res; } function _postOrder($root){ if($root === null){ return ; } $this->_postOrder($root->left); $this->_postOrder($root->right); $this->res[] = $root->val; } }
层次遍历
层次遍历:每层从左向右一次遍历每一层。
class Solution { function getHeight($root){ if($root == null){ return 0; } $left_height = $this->getHeight($root->left); $right_height = $this->getHeight($root->right); return $left_height > $right_height ? $left_height +1 : $right_height +1; } /** * @param TreeNode $root * @return TreeNode */ function levelOrder($root) { $list = []; //list是队列 $res = []; //最终结果 if($root == null){ return []; } //先把根节点入队 array_push($list, $root); //如果队列不为空,说明没有遍历完 while(!empty($list)){ $size = count($list); $tmp_arr = []; //根据每层入队的节点数,进行循环 for($i=0;$i<$size;$i++){ //队列出队一个元素,在for中把这层元素都过一遍 $tmp = array_shift($list); //保存层次遍历的中间结果 $tmp_arr[] = $tmp->val; //如果有子节点,那么就入队 if($tmp->left != null){ array_push($list, $tmp->left); } if($tmp->right != null){ array_push($list, $tmp->right); } } $res[] = $tmp_arr; } return $res; } }
思路
层次遍历使用一个队列保存每层的节点,遍历这次的所有节点,这个过程中取出下层的子节点入队。如果队列不为空,继续遍历。利用了队列先进先出的性质。
这篇关于二叉树的遍历算法:深度优先遍历和层次遍历【leetcode-144,102】PHP的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23怎么实现安卓+php 热更新方案?-icode9专业技术文章分享
- 2024-11-22PHP 中怎么实现判断多个值是否为空、null 或者为 false?-icode9专业技术文章分享
- 2024-11-11开源 PHP 商城项目 CRMEB 二次开发和部署教程
- 2024-11-09怎么使用php在kaufland平台刊登商品?-icode9专业技术文章分享
- 2024-11-05PHP的抽象类和接口是什么,有什么区别-icode9专业技术文章分享
- 2024-11-01开源 PHP 商城项目 CRMEB 安装和使用教程
- 2024-11-01用php和mysql写无限分类,有哪几种方法-icode9专业技术文章分享
- 2024-10-31php数据分表导出时部分数据无法导出什么原因-icode9专业技术文章分享
- 2024-10-30有经验的 PHP 开发者学习一门新的编程语言,有哪些推荐的有前景的语言-icode9专业技术文章分享
- 2024-10-21php 检测图片是否篡改过-icode9专业技术文章分享