美文网首页皮皮的LeetCode刷题库
【剑指Offer】060——把二叉树打印成行 (队列、树)

【剑指Offer】060——把二叉树打印成行 (队列、树)

作者: 就问皮不皮 | 来源:发表于2019-08-23 07:16 被阅读5次

题目描述

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

解题思路

就是二叉树的层序遍历,用队列来实现。我们需要两个变量,一个start记录当前层已经打印的节点个数,一个end记录前当层所有的节点个数,当 start == end 时,表时当前层遍历完了,就可以开始下一层遍历。

参考代码

Java

import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer> >();
        // 边界
        if(pRoot == null)
            return res;
        ArrayList<Integer> temp = new ArrayList<Integer>(); // 每行的结果
        Queue<TreeNode> layer = new LinkedList<TreeNode>(); // 队列
        layer.offer(pRoot);//第一次运行 先添加根结点
        int start = 0, end = 1; // 使用开始与结束结束控制每一行,第一行长度为1(一个根)
        while(!layer.isEmpty()){
            TreeNode node = layer.poll(); // 弹出当前层
            temp.add(node.val);           // 添加道每一行的ArrayList中
            start ++;                     // 移动start
            if(node.left != null)         // 开始添加下一层(从左到右添加)
                layer.add(node.left);
            if(node.right != null)
                layer.add(node.right);
            if(start == end){
                start = 0;
                res.add(temp);
                temp = new ArrayList<Integer>(); // 新建一层
                end = layer.size();
            }
        }
        return res;
    }
}

Python

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回二维列表[[1,2],[4,5]]
    def Print(self, pRoot):
        # write code here
        # 结果,每行的结果,
        res, temp, layer,start, end = [],[],[],0,1
        if not pRoot:
            return res
        layer.append(pRoot)
        while len(layer) > 0:
            node = layer.pop(0)
            temp.append(node.val)
            start += 1
            if node.left:
                layer.append(node.left)
            if node.right:
                layer.append(node.right)
            if start == end:
                start = 0
                res.append(temp)
                temp = []
                end = len(layer)
        return res

个人订阅号

image

相关文章

网友评论

    本文标题:【剑指Offer】060——把二叉树打印成行 (队列、树)

    本文链接:https://www.haomeiwen.com/subject/yuwosctx.html