版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010365335/article/details/87684254
目录
二叉树的层次遍历解题方式:(利用队列)
节点依次入队依次访问,队列形式[节点,层级],可根据层级将节点的值塞入结果数组中即可
102.二叉树的层次遍历
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树:[3,9,20,null,null,15,7]
,3 / \ 9 20 / \ 15 7
返回其层次遍历结果:
[ [3], [9,20], [15,7] ]
解题:
1.初始条件判断,树是否为空
2.构建初始队列,队列形式 [节点,层级] ,将头结点塞入队列中
3.依次出队,将节点的值根据层级塞入结果数组中
4.判断左右孩子是否存在,存在即压入队列中,层级+1
5.循环出队,直至队列为空
LeetCode其他题目与其类似,如下:
(1)107.二叉树的层次遍历 II
区别:返回其节点值自底向上的层次遍历
解法:经过102解法得出的结果数组,直接进行翻转即可
(2)199. 二叉树的右视图
区别:返回从右侧所能看到的节点值
解法:经过102解法得出的结果数组,取出每一子数组的最后一个元素即可
/**
* Definition for a binary tree node.
* class TreeNode {
* public $val = null;
* public $left = null;
* public $right = null;
* function __construct($value) { $this->val = $value; }
* }
*/
class Solution {
function levelOrder($root) {
$res = []; //结果数组
if(is_null($root)){ //判断二叉树是否为空
return $res;
}
$queue = []; //构建初始队列
$queue[] = [$root,0]; //队列元素:[节点,层级]
while(!empty($queue)){
$node = array_shift($queue); //层层出队
$level = $node[1]; //层级
$p = $node[0]; //节点
$res[$level][] = $p->val; //根据结果层级压入结果数组
if($p->left) //如果该节点有左孩子,则入队,且层级+1
$queue[] = [$p->left,$level+1];
if($p->right) //如果该节点有右孩子,则入队,且层级+1
$queue[] = [$p->right,$level+1];
}
return $res; //102
//return array_reverse($res); 107.二叉树的层次遍历 II
/* 199. 二叉树的右视图
$result = [];
foreach($res as $v){
$result[] = array_pop($v);
}
return $result;
*/
}
}
103.二叉树的锯齿形层次遍历
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树[3,9,20,null,null,15,7]
,3 / \ 9 20 / \ 15 7
返回锯齿形层次遍历如下:
[ [3], [20,9], [15,7] ]
与102区别:该题层次遍历呈锯齿转,即一次是从左到右,下一次则从右到左遍历,交替反复
解法:与102区别在压入结果数组的操作中
判断层级,若层级时偶数,则将结果元素压入对应层级子数组的头部,若为奇数,则压入尾部
class Solution {
function zigzagLevelOrder($root) {
$res = []; //结果数组
if(is_null($root)){ //判断二叉树是否为空
return $res;
}
$queue = []; //构建初始队列
$queue[] = [$root,0]; //队列元素:[节点,层级]
while(!empty($queue)){
$node = array_shift($queue); //层层出队
$level = $node[1]; //层级
$p = $node[0]; //节点
/* 区别代码start */
if(empty($res[$level])){ //如果该层级对应的子数组为空,则初始化数组一下
$res[$level] = []; //否则下方若执行压入头元素时,会报错
}
if($level%2){ //如果层级时偶数,则结果元素应该压入头部
array_unshift($res[$level],$p->val);
}else{ //如果层级时奇数,则结果元素应该压入尾部
$res[$level][] = $p->val;
}
/* 区别代码end */
if($p->left){ //如果该节点有左孩子,则入队,且层级+1
$queue[] = [$p->left,$level+1];
}
if($p->right){ //如果该节点有右孩子,则入队,且层级+1
$queue[] = [$p->right,$level+1];
}
}
return $res; //返回结果数组即可
}
}