leetcode解题之102&107. Binary Tree Level Order Traversal java版(二叉树层次遍历)

来源:互联网 发布:centos7 yum安装wget 编辑:程序博客网 时间:2024/05/29 13:55

102. Binary Tree Level Order Traversal

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

For example:
Given binary tree [3,9,20,null,null,15,7],

    3   / \  9  20    /  \   15   7

return its level order traversal as:

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

层次遍历二叉树,就是首先访问二叉树的第一层元素,再访问第二层,接着访问第三层,以此类推。实现的方式是,用一个先进先出的队列作为辅助数据数据结构,

维护一个当前结点数目,和下一层结点数目,当前层遍历层,加入结果集

public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> ret = new ArrayList<>();if (root == null)return ret;levelOrderCore(root, ret);return ret;}public void levelOrderCore(TreeNode root, List<List<Integer>> ret) {// 用来标记下一行有多少元素int nextCount = 0;// 当前层有多少结点,为1 是根节点初始化int curCount = 1;Queue<TreeNode> q = new LinkedList<>();q.offer(root);List<Integer> tmp = new ArrayList<>();while (!q.isEmpty()) {TreeNode node = q.poll();tmp.add(node.val);// 遍历结点当前个数减去1curCount--;if (node.left != null) {q.offer(node.left);// 左右孩子属于下一层结点nextCount++;}if (node.right != null) {q.offer(node.right);nextCount++;}// 如果当前层遍历完,加入结果集合if (curCount == 0) {curCount = nextCount;nextCount = 0;ret.add(new ArrayList<>(tmp));tmp.clear();}}}

107. Binary Tree Level Order Traversal II

    3   / \  9  20    /  \   15   7

return its bottom-up level order traversal as:

[  [15,7],  [9,20],  [3]]
倒序输入,可以加入结点,最后翻转,或者每次加入链表头部,建议使用双向链表,插入速度快。

public List<List<Integer>> levelOrderBottom(TreeNode root) {List<List<Integer>> ret = new LinkedList<>();if (root == null)return ret;// 直接插入在头部,或者最后翻转链表levelOrderCore(root, ret);return ret;}//时间复杂度:O(n)//空间复杂度:O(n)public void levelOrderCore(TreeNode root, List<List<Integer>> ret) {int nextCount = 0;int curCount = 1;// 队列,层次遍历Queue<TreeNode> q = new LinkedList<>();q.offer(root);List<Integer> tmp = new LinkedList<>();while (!q.isEmpty()) {TreeNode node = q.poll();tmp.add(node.val);curCount--;if (node.left != null) {q.offer(node.left);nextCount++;}if (node.right != null) {q.offer(node.right);nextCount++;}if (curCount == 0) {curCount = nextCount;nextCount = 0;// 把结点添加到头部,使用双向链表LinkedListret.add(0, new LinkedList<>(tmp));tmp.clear();}}}


1 0