您的位置:首页 > 编程语言 > Java开发

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();

}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐