LeetCode107. Binary Tree Level Order Traversal II

来源:互联网 发布:算法心得 epub 编辑:程序博客网 时间:2024/05/17 09:38

107.Binary Tree Level Order Traversal II

image

public class TreeNode {    int val;    TreeNode left;    TreeNode right;    TreeNode(int x) { val = x; }}

方法一:
受上一题104.MaximumDepthofBinaryTree的启发,使用队列来做,最后要做一个元素反转处理。其实这种做法就是BFS(广度优先搜索)。

public List<List<Integer>> levelOrderBottom(TreeNode root) {    List<List<Integer>> result = new ArrayList<>();    if(root == null) return result;    Queue<TreeNode> q = new LinkedList<>();    q.add(root);            while(!q.isEmpty()){        List<Integer> levelnode = new ArrayList<>();        for(int i = 0, n = q.size(); i < n; i++){            TreeNode node = q.poll();            levelnode.add(node.val);            if(node.left != null) q.add(node.left);            if(node.right != null) q.add(node.right);        }        result.add(levelnode);    }    int length = result.size();    for(int i = 0; i < length / 2; i++){        List<Integer> temp = result.get(i);        result.set(i, result.get(length - 1 - i));        result.set(length - 1 - i, temp);    }    return result;}

方法二:
方法二与方法一思路相同,代码几乎相同,不同的点在于,这里省去了上面将列表翻转的处理,使用 List 自带的方法,List.add(int index, Object object), 这个方法可以在指定位置加入对象,index 每次都为0,即为倒序排列。

public List<List<Integer>> levelOrderBottom2(TreeNode root) {    Queue<TreeNode> queue = new LinkedList<TreeNode>();    List<List<Integer>> wrapList = new LinkedList<List<Integer>>();    if(root == null) return wrapList;    queue.offer(root);    while(!queue.isEmpty()){        int levelNum = queue.size();        List<Integer> subList = new LinkedList<Integer>();        for(int i=0; i<levelNum; i++) {            if(queue.peek().left != null) queue.offer(queue.peek().left);            if(queue.peek().right != null) queue.offer(queue.peek().right);            subList.add(queue.poll().val);        }        wrapList.add(0, subList);//相当于每次加入的元素都放在第一个位置,免去了上面交换位置的过程    }    return wrapList;}

方法三:
使用DFS(深度优先搜索),采用递归,递归理解起来比较抽象。

public List<List<Integer>> levelOrderBottom3(TreeNode root) {    List<List<Integer>> wrapList = new LinkedList<List<Integer>>();    levelMaker(wrapList, root, 0);    return wrapList;}public void levelMaker(List<List<Integer>> list, TreeNode root, int level) {    if(root == null) return;    if(level >= list.size()) {        list.add(0, new LinkedList<Integer>());    }    list.get(list.size()-level-1).add(root.val);    levelMaker(list, root.left, level+1);    levelMaker(list, root.right, level+1);        }
原创粉丝点击