剑指offer: 从上往下打印二叉树

**题目来源:牛客网


题目描述

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

代码实现

该代码能通过,但是这个代码是不正确。根据下面代码可以发现,牛客网关于本题的测试用例的应该为 空的二叉树、三层以内的二叉树、一个结点的二叉树、单二叉树(只有左子树或者右子树)

import java.util.ArrayList;
/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
 
    public TreeNode(int val) {
        this.val = val;
 
    }
 
}
*/
public class Solution {
    private ArrayList list = new ArrayList<>();
     
    public ArrayList PrintFromTopToBottom(TreeNode root) {
        if (root == null) {
            return list;
        }
        if (list.size() == 0) {
            list.add(root.val);
        }
        if (root.left != null) {
            list.add(root.left.val);
        }
        if (root.right != null) {
            list.add(root.right.val);
        }
        PrintFromTopToBottom(root.left);
        PrintFromTopToBottom(root.right);
        return this.list;
    }
}

正确的做法:层次遍历,利用链表或者队列来实现。

import java.util.ArrayList;
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 {
    public ArrayList PrintFromTopToBottom(TreeNode root) {
        ArrayList list = new ArrayList<>();
        if (root == null) {
            return list;
        }
        LinkedList quote = new LinkedList<>();
        quote.offer(root);
        while (quote.size() != 0) {
            TreeNode temp = quote.poll();
            if (temp.left != null) {
                quote.offer(temp.left);
            }
            if (temp.right != null) {
                quote.offer(temp.right);
            }
            list.add(temp.val);
        }
        return list;
    }
}


你可能感兴趣的:(剑指offer: 从上往下打印二叉树)