按之字形顺序打印二叉树

未匹配的标注

题目描述

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

输入:

{8,6,10,5,7,9,11}

输出:

[[8],[10,6],[5,7,9,11]]

分析

这道题与“把二叉树打印成多行”类似,只不过这道题在返回结果数组前,根据层级判断是否需要从右到左顺序输出。

代码

/**
 * 节点
 */
class TreeNode{
    var $val;
    var $left = NULL;
    var $right = NULL;

    function __construct($val){
        $this->val = $val;
    }
}

<?php

namespace app\controller;

class Index
{
    /**
     * 广度优先搜索
     *
     * @param $pRoot
     * @return null
     */
    public function BFS($pRoot)
    {
        if ($pRoot == null) return [];

        $queue = new \SplQueue();
        $queue->enqueue([$pRoot]);                    // 初始化:第一层放根节点
        $list = [];                                   // 存放结果数组

        while (!$queue->isEmpty()) {
            $currentRoot        = $queue->dequeue();  // 取出队列头节点
            list($level, $node) = each($currentRoot); // 键为层级,值为节点
            $list[$level][]     = $node->val;         // 放入结果数组

            if ($node->left) $queue->enqueue([$level + 1 => $node->left]);  // 左节点放入队列,层级加1
            if ($node->right) $queue->enqueue([$level + 1 => $node->right]);// 右节点放入队列,层级加1
        }

        // 根据层级翻转节点
        return array_map(function ($k) {
            if ($k % 2 != 0) return array_reverse($k);
        }, $list);

    }

}

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~