LeetCode题解-102&107-Binary Tree Level Order Traversal Ⅰ,Ⅱ

来源:互联网 发布:mac电脑顿号怎么打 编辑:程序博客网 时间:2024/06/06 00:00

原题

102


107



解法

思路分析

与前面很多的题类似,为二叉树的广度优先遍历(BFS),借助一个队列,共N次迭代,N为树的层高,每一次迭代全部第i层的节点出队列,第i+1层的节点进队列,因此每一次可以处理第i层的所有节点的值。


图解(102)

107的图解和102几乎相同,除了oneLevelNodes每次都是增加到AllLevelNodes的最前端;


代码102

由于oneLevelNodes每次都是增加到AllLevelNodes的尾部,所以采用ArrayList;

public class Solution102 {    public List<List<Integer>> levelOrder(TreeNode root) {        List<List<Integer>>  allLevelNodes = new ArrayList<List<Integer>>();        List<Integer> oneLevelNode = new ArrayList<Integer>();        Deque<TreeNode> deque = new LinkedList<TreeNode>();        if (root != null)            deque.push(root);        while (!deque.isEmpty()){            int dequeSize = deque.size();            while (dequeSize-- > 0){                TreeNode currentNode =                        deque.pop();                oneLevelNode.add(currentNode.val);                if (currentNode.left != null)                    deque.addLast(currentNode.left);                if (currentNode.right != null)                    deque.addLast(currentNode.right);            }            allLevelNodes.add(new ArrayList<Integer>(oneLevelNode));            oneLevelNode.clear();        }        return allLevelNodes;    }}

代码107

oneLevelNodes每次都是插入到AllLevelNodes的最前端,所以采用LinkedList

public class Solution107 {    public List<List<Integer>> levelOrderBottom(TreeNode root) {        Deque<List<Integer>>  allLevelNodes = new LinkedList<List<Integer>>();        List<Integer> oneLevelNode = new ArrayList<Integer>();        Deque<TreeNode> deque = new LinkedList<TreeNode>();        if (root != null)            deque.push(root);        while (!deque.isEmpty()){            int dequeSize = deque.size();            while (dequeSize-- > 0){                TreeNode currentNode =                        deque.pop();                oneLevelNode.add(currentNode.val);                if (currentNode.left != null)                    deque.addLast(currentNode.left);                if (currentNode.right != null)                    deque.addLast(currentNode.right);            }            allLevelNodes.push(new ArrayList<Integer>(oneLevelNode));            oneLevelNode.clear();        }        return (List<List<Integer>>)allLevelNodes;    }}

编程时遇到的错误

对List理解的不够深刻,在代码102中往二维List中添加List一开始是使用 allLevelNodes.add(new ArrayList<Integer>(oneLevelNode)); ,这样的话每次添加的都是相同的oneLevelNode这个对象,因此oneLevelNode.clear();之后,allLevelNodes就变为了{[], [], []},应该建立一个新的对象allLevelNodes.add(new ArrayList<Integer>(oneLevelNode));

小demo如下:

public class Main {    public static void main(String[] args) throws UnsupportedEncodingException {        List<List<String>> listList1 = new ArrayList<List<String>>();        List<String> list = new ArrayList<String>();        list.add("1");        listList1.add(list);        System.out.println("第一次:" + listList1);        list.add("2");        listList1.add(list);        System.out.println("第二次:" + listList1);    }}
输出:


public class Main {    public static void main(String[] args) throws UnsupportedEncodingException {        List<List<String>> listList1 = new ArrayList<List<String>>();        List<String> list = new ArrayList<String>();        list.add("1");        listList1.add(new ArrayList<String>(list));        System.out.println("第一次:" + listList1);        list.add("2");        listList1.add(new ArrayList<String>(list));        System.out.println("第二次:" + listList1);    }}

输出:




0 0