深度优先遍历
先序遍历:根->左->右
中序遍历:左->根->右
后序遍历:左->右->根
先序遍历
节点定义
class TreeNode {
public $val = null;
public $left = null;
public $right = null;
function __construct($value) { $this->val = $value; }
}
思路
非递归先序遍历,使用栈结构
class Solution {
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 {
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;
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;
}
function levelOrder($root) {
$list = [];
$res = [];
if($root == null){
return [];
}
array_push($list, $root);
while(!empty($list)){
$size = count($list);
$tmp_arr = [];
for($i=0;$i<$size;$i++){
$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;
}
}
思路
层次遍历使用一个队列保存每层的节点,遍历这次的所有节点,这个过程中取出下层的子节点入队。如果队列不为空,继续遍历。利用了队列先进先出的性质。
打开App,阅读手记