【LeetCode】Binary Tree Level Order Traversal 解题报告

来源:互联网 发布:网络媒介推广 编辑:程序博客网 时间:2024/05/22 20:39

Binary Tree Level Order Traversal

[LeetCode]

https://leetcode.com/problems/binary-tree-level-order-traversal/

Total Accepted: 70423 Total Submissions: 236710 Difficulty: Easy

Question

Given a binary tree, return the level order traversal of its nodes’ values. (ie, from left to right, level by level).

Examples

For example:
Given binary tree {3,9,20,#,#,15,7},

3  

/ \
9 20
/ \
15 7

return its level order traversal as:

[
[3],
[9,20],
[15,7]
]

Ways

方法一

通过直接的每行元素放到一个List中,再把List放到要返回的List中的方法。我的方法中,每个要放的东西使用了两个List,一个放整形的值,一个放这个TreeNode。根据上一层的List来加入这一层的TreeNode。并且要判断,如果为空则不能加入要返回的List中。

    /**     * 将root先添加到treeList中     *     * @param root     * @return     */    public static List<List<Integer>> getTreeOrder(TreeNode root) {        //LeetCode测试时连续的测试,这些static量不能在类中赋值,否则第二次测试时会保留上次结果        //在函数中初始化        treeList = new ArrayList<List<TreeNode>>();        levelList = new ArrayList<TreeNode>();        levelInt = new ArrayList<Integer>();        lists = new ArrayList<List<Integer>>();        level = 0;        if (root == null) {            return lists;        }        levelList.add(root);        treeList.add(levelList);        levelInt.add(root.val);        System.out.println("root val:===" + root.val);        lists.add(levelInt);        getLevelTree();        return lists;    }    /**     * 循环判断添加此外的树枝     */    public static void getLevelTree() {        levelList = new ArrayList<TreeNode>();        levelInt = new ArrayList<Integer>();        //如果本层为空,那么没有添加到treeList中,所以加一个treeList.size() == level的判断        if (treeList.size() == level || treeList.get(level).size() == 0) {            return;        }        for (int i = 0; i < treeList.get(level).size(); i++) {            if (treeList.get(level).get(i).left == null && treeList.get(level).get(i).right == null) {                //是continue 不是  break                //因为有可能某一个叶子没有孩子但是,它的兄弟节点有孩子,break之后就不会再判断了                continue;            }            //不是else if的关系,因为每个都要进行判断            if (treeList.get(level).get(i).left != null) {                levelList.add(treeList.get(level).get(i).left);                levelInt.add(treeList.get(level).get(i).left.val);                System.out.println("left val:===" + treeList.get(level).get(i).left.val);            }            if (treeList.get(level).get(i).right != null) {                levelList.add(treeList.get(level).get(i).right);                levelInt.add(treeList.get(level).get(i).right.val);                System.out.println("right val:===" + treeList.get(level).get(i).right.val);            }        }        //如果本层为空,那么没有添加到treeList中        if (levelList.size() != 0) {            treeList.add(levelList);            lists.add(levelInt);        }        level++;        getLevelTree();    }

方法二

**使用队列的方法。
学习了java队列的使用。在一个队列中,放入第一个元素,取出后,放入左右孩子,再根据左右孩子逐个放入其后相应的孩子。队列为空的时候,说明已经遍历完成。
这个方法非常好,学习了。**

    /**     * 运用栈的方法解决的该问题     * 注意一个栈中,各种方法的区别     * 有些方法失败会报错,有些会进行返回值告诉程序     *     * @param root     * @return     */    public static ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) {        ArrayList result = new ArrayList();        if (root == null) {            return result;        }        Queue<TreeNode> queue = new LinkedList<TreeNode>();        queue.offer(root);        while (!queue.isEmpty()) {            ArrayList<Integer> level = new ArrayList<Integer>();            int size = queue.size();            for (int i = 0; i < size; i++) {                TreeNode head = queue.poll();                level.add(head.val);                if (head.left != null) {                    queue.offer(head.left);                }                if (head.right != null) {                    queue.offer(head.right);                }            }            result.add(level);        }        return result;    }

Solution

托管在我的GitHub上:

https://github.com/fuxuemingzhu/LevelOrderTraversal

Captures

测试结果截图:

Reference

http://www.jiuzhang.com/solutions/binary-tree-level-order-traversal/

Date

2015/10/13 19:25:00

0 0
原创粉丝点击