【PHP解法==LeetCode102.103.107.199】二叉树层次遍历相关问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010365335/article/details/87684254

目录

102.二叉树的层次遍历

103.二叉树的锯齿形层次遍历


二叉树的层次遍历解题方式:(利用队列)

节点依次入队依次访问,队列形式[节点,层级],可根据层级将节点的值塞入结果数组中即可


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;                                //返回结果数组即可
    }
}

猜你喜欢

转载自blog.csdn.net/u010365335/article/details/87684254