美文网首页皮皮的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