【Leetcode】107. Binary Tree Level Order Traversal II

来源:互联网 发布:我要请运营淘宝的 编辑:程序博客网 时间:2024/06/15 07:29

方法一:递归

思路:

(1)若树为空,直接返回result。

(2)先把根节点加如result。

(3)求出左子树自底向上层次遍历的结果left和右子树自底向上层次遍历的结果right。

(4)从后往前依次将left和right的对应层的结果依次加入result。

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Solution {    public List<List<Integer>> levelOrderBottom(TreeNode root) {        List<List<Integer>> result = new ArrayList<List<Integer>>();        if (root == null)            return result;        List<Integer> temp = new ArrayList<Integer>();        temp.add(root.val);        result.add(temp);        List<List<Integer>> left = levelOrderBottom(root.left);        List<List<Integer>> right = levelOrderBottom(root.right);        int leftSize = left.size();        int rightSize = right.size();        int max = Math.max(leftSize, rightSize);        int size = Math.abs(leftSize - rightSize);        for (int i = max -1; i >= 0; i--) {            temp = new ArrayList<Integer>();            if (rightSize > leftSize) {                if (i >= size)                    temp.addAll(left.get(i - size));                temp.addAll(right.get(i));            }            else {                temp.addAll(left.get(i));                if (i >= size)                    temp.addAll(right.get(i - size));            }            result.add(0, temp);        }        return result;    }}
Runtime:63ms


方法二:非递归

思路:

(1)若树为空,则直接返回result。

(2)创建一个队列queue,用于存放所有节点;创建一个列表list记录当前层所有节点的值。

(3)将根节点加入queue。

(4)对每一层,每次获取并移除队列的头结点,即可访问该层的所有节点,对每一个节点,将其值记录到list中,并将其左右孩子加入queue。

(5)每一层处理完毕后,将list加入result的前面。

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Solution {    public List<List<Integer>> levelOrderBottom(TreeNode root) {        List<List<Integer>> result = new ArrayList<List<Integer>>();        if (root == null)            return result;        Queue<TreeNode> queue = new LinkedList<TreeNode>();        queue.add(root);        while (!queue.isEmpty()) {            List<Integer> list = new ArrayList<Integer>();            int size = queue.size();            for (int i = 0; i < size; i++) {                TreeNode node = queue.poll();                list.add(node.val);                if (node.left != null)                    queue.add(node.left);                if (node.right != null)                    queue.add(node.right);            }            result.add(0, list);        }        return result;    }}

Runtime:3ms

1 0
原创粉丝点击