Home

凡是过往 皆为序章

二叉树的层序遍历-java引用问题解决

题目

102. 二叉树的层序遍历

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

示例 1:

img

1
2
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例 2:

1
2
输入:root = [1]
输出:[[1]]

示例 3:

1
2
输入:root = []
输出:[]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/

原本思路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
Queue<TreeNode> q = new ArrayDeque<>();
if (root == null) {
return new ArrayList<>();
}
List<List<Integer>> list = new ArrayList<>();
List<Integer> list1 = new ArrayList<>();
q.add(root);
while (!q.isEmpty()) {
int n = q.size();
list1.clear();
for (int i = 0; i < n; i++) {
TreeNode treeNode = q.poll();
list1.add(treeNode.val);
if (treeNode.left != null) {
q.add(treeNode.left);
}
if (treeNode.right != null) {
q.add(treeNode.right);
}
}
list.add(list1);
}
System.out.println(list);
return list;
}
}

输入

root = [3,9,20,null,null,15,7]

标准输出

[[15, 7], [15, 7], [15, 7]]

输出

[[15,7],[15,7],[15,7]]

预期结果

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

可以看到这里的输出每一个元素都变成了最后一个元素。

原因分析

原因就出在 list1.clear();这行代码上。

这里的clear只会清空list1中的数据,不会创建一个新的对象。由于每次迭代添加到list中的都是list1对象,

所以在清空list1后,向list中添加的仍然是同一个list1对象的引用,这就导致list1变化的时候list中的其他元素也都跟着list1变化。

解决方案

list1.clear();处重新创建一个list1对象

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
Queue<TreeNode> q = new ArrayDeque<>();
if (root == null) {
return new ArrayList<>();
}
List<List<Integer>> list = new ArrayList<>();
q.add(root);
while (!q.isEmpty()) {
int n = q.size();
List<Integer> list1 = new ArrayList<>();
for (int i = 0; i < n; i++) {
TreeNode treeNode = q.poll();
list1.add(treeNode.val);
if (treeNode.left != null) {
q.add(treeNode.left);
}
if (treeNode.right != null) {
q.add(treeNode.right);
}
}
list.add(list1);
}
System.out.println(list);
return list;
}
}

附录

另外附上通过数组构建数的完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
class Tests {
public static void main(String[] args) {
Integer[] nums = {3, 9, 20, null, null, 15, 7};
TreeNode root = buildTree(nums, 0);
levelOrder(root);
}

private static List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> list = new ArrayList<>();
Queue<TreeNode> q = new ArrayDeque<>();
if (root == null) {
return list;
}
q.add(root);
List<Integer> list1 = new ArrayList<>();

while (!q.isEmpty()) {
int n = q.size();
list1.clear();
for (int i = 0; i < n; i++) {
TreeNode treeNode = q.poll();
list1.add(treeNode.val);
if (treeNode.left != null) {
q.add(treeNode.left);
}
if (treeNode.right != null) {
q.add(treeNode.right);
}
}
System.out.println(list1);
list.add(list1);
}
System.out.println(list);
return list;
}

private static TreeNode buildTree(Integer[] nums, int index) {
if (index >= nums.length || nums[index] == null) {
return null;
}
TreeNode root = new TreeNode(nums[index]);
root.left = buildTree(nums, 2 * index + 1);
root.right = buildTree(nums, 2 * index + 2);
return root;

}
}


class TreeNode {
int val;
TreeNode left;
TreeNode right;

TreeNode() {
}

TreeNode(int val) {
this.val = val;
}

TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}