从上往下打印二叉树

题目描述

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

递归方法

递归遍历二叉树,用二叉树的固定叶子序号来标记叶子数据,若某个序号没有节点,则用Integer.MAX_VALUE标记,最后删除“空节点”即不打印空节点,按叶子序号打印二叉树。这种方法是比较暴力,但是可以通过测试用例。

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 static final int ARRAY_SIZE = 1000;

    //用此值定义“空节点”的序号
    private static final int NULL_VAL = Integer.MAX_VALUE;

    //标记节点类型
    private static final int NODE_ROOT = 0;
    private static final int NODE_LEFT = 1;
    private static final int NODE_RIGHT = 2;

    public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {

        if(null == root) {
            return new ArrayList<Integer>();
        }

        ArrayList<Integer> array = new ArrayList<Integer>(ARRAY_SIZE);

        for(int i = 0; i < ARRAY_SIZE; i ++) {
            array.add(i, new Integer(NULL_VAL));
        }

        //递归遍历获取叶子序号列表
        getNode(root, 0, array);

        //返回从上往下的二叉树,即去除空节点
        return sortNode(array);
    }

    /**
     * 递归获取节点列表
     * 序号根据二叉树的特征获取 
     * leftNodeIndex = rootIndex * 2 + 1 rightNodeIndex = rootIndex * 2 + 2 
     */
    private void getNode(TreeNode root, int rootIndex, ArrayList<Integer> array) {
        if(null == root) {
            return;
        } else {
            array.set(rootIndex, new Integer(root.val));
        }
        getNode(root.left, rootIndex * 2 + 1, array);
        getNode(root.right, rootIndex * 2 + 2, array);
    }

    /**
     * 不打印空节点
     */
    private ArrayList<Integer> sortNode(ArrayList<Integer> array) {
        ArrayList<Integer> returnArray = new ArrayList<Integer>();

        for(int i = 0; i < array.size(); i ++) {
            if(NULL_VAL != array.get(i) && null != array.get(i)) {
                returnArray.add(array.get(i));
            }
        }

        return returnArray;
    }
}

队列

经人指点,选择了正确的数据结构–队列 解决这题。逻辑清晰,代码优雅。

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 {

    Queue<TreeNode> queue = new LinkedList<TreeNode>();

    ArrayList<Integer> resultArr = new ArrayList<Integer>();

    /**
     * 从根节点开始,value add到列表中,并将子节点放进队列中
     * 从队列中取出一个节点,重复以上步骤,直至队列为空
     */    
    public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
        if(null == root) {
            return resultArr;
        } 

        resultArr.add(root.val);

        if(null != root.left) {
            queue.offer(root.left);
        }
        if(null != root.right) {
            queue.offer(root.right);
        }

        return PrintFromTopToBottom(queue.poll());
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值