leetcode解题之102&107. Binary Tree Level Order Traversal java版(二叉树层次遍历)
2017-04-10 00:12
405 查看
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); // 遍历结点当前个数减去1 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; 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; // 把结点添加到头部,使用双向链表LinkedList ret.add(0, new LinkedList<>(tmp)); tmp.clear(); } } }
相关文章推荐
- leetCode解题报告之Binary Tree Level Order Traversal II,I(二叉树层次遍历)
- leetcode解题之112 & 113 & 437. Path Sum java版(二叉树路径和)
- Leetcode 107. Binary Tree Level Order Traversal II 二叉树层次遍历2 解题报告
- leetcode-二叉树的层次遍历(Java)
- LeetCode103 BinaryTreeZigzagLevelOrderTraversal(二叉树Z形层次遍历) Java题解
- LeetCode103 BinaryTreeZigzagLevelOrderTraversal(二叉树Z形层次遍历) Java题解
- 【LeetCode-面试算法经典-Java实现】【107-Binary Tree Level Order Traversal II(二叉树层序遍历II)】
- leetcode 二叉树层次遍历输出Binary Tree Level Order Traversal
- JAVA语言实现二叉树的层次遍历的非递归算法及递归算法。
- Java二叉树按层次遍历,换行输出
- java 二叉树的实现与先序遍历和层次遍历
- java根据层次遍历建立二叉树
- 二叉树层次遍历java
- 【LeetCode-面试算法经典-Java实现】【103-Binary Tree Zigzag Level Order Traversal(二叉树分层Z字形遍历)】
- 102.LeetCode Binary Tree Level Order Traversal(easy)[二叉树层次遍历 广度搜索 队列]
- 【LeetCode-面试算法经典-Java实现】【102-Binary Tree Level Order Traversal(二叉树层序遍历)】
- LeetCode(Binary Tree Level Order Traversal, 2,Zigzag)二叉树的层次遍历
- JAVA语言实现二叉树的层次遍历的非递归算法及递归算法
- java建立二叉树,递归/非递归先序遍历,递归/非递归中序遍历,层次遍历
- LeetCode: 102_Binary Tree Level Order Traversal | 二叉树自顶向下的层次遍历 | Easy