LeetCode 第102题 二叉树的层次遍历

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

例如:
给定二叉树: [3,9,20,null,null,15,7],

3
/ \
9 20
/ \
15 7
返回其层次遍历结果:

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


 1 /*
 2   思路1 : 用两个链表分别代替两个层次,交替使用
 3    */
 4   public List<List<Integer>> levelOrder(TreeNode root) {
 5     List<List<Integer>> res = new ArrayList<>();
 6     if (root == null) {
 7       return res;
 8     }
 9     List<TreeNode> list1 = new LinkedList<>();
10     List<TreeNode> list2 = new LinkedList<>();
11     list1.add(root);
12     while (list1.size() != 0 || list2.size() != 0) {
13       List<TreeNode> notEmptyList = list1.size() == 0
14           ? list2
15           : list1;
16       List<TreeNode> emptyList = list1.size() == 0
17           ? list1
18           : list2;
19       List<Integer> resList = new LinkedList<>();
20       while (notEmptyList.size() != 0) {
21         TreeNode temp = notEmptyList.remove(0);
22         resList.add(temp.val);
23         if (temp.left != null) {
24           emptyList.add(temp.left);
25         }
26         if (temp.right != null) {
27           emptyList.add(temp.right);
28         }
29       }
30       res.add(resList);
31     }
32     return res;
33   }

 

 

 1 /*
 2   思路2 : 直接层次遍历
 3    */
 4   public List<List<Integer>> levelOrder_1(TreeNode root) {
 5     List<List<Integer>> res = new ArrayList<>();
 6     if (root == null) {
 7       return res;
 8     }
 9     LinkedList<TreeNode> list = new LinkedList<>();
10     list.add(root);
11     int currLevelNodes = 1;
12     while (list.size() != 0) {
13       LinkedList<Integer> resList = new LinkedList<>();
14       currLevelNodes = list.size();
15       for (int i = currLevelNodes; i > 0; --i) {
16         TreeNode removeNode = list.remove();
17         resList.add(removeNode.val);
18         if (removeNode.left != null) {
19           list.add(removeNode.left);
20         }
21         if (removeNode.right != null) {
22           list.add(removeNode.right);
23         }
24       }
25       res.add(resList);
26     }
27     return res;
28   }

 

 

 1 /*
 2   思路3 : 递归层次遍历
 3    */
 4   public List<List<Integer>> levelOrder_2(TreeNode root) {
 5     List<List<Integer>> res = new ArrayList<>();
 6     search(root, 0, res);
 7     return res;
 8   }
 9 
10   private void search(TreeNode parent, int level, List<List<Integer>> res) {
11     if (parent == null) {
12       return;
13     }
14     if (res.size() <= level) {
15       res.add(new ArrayList<>());
16     }
17     res.get(level).add(parent.val);
18     search(parent.left, level + 1, res);
19     search(parent.right, level + 1, res);
20   }

 

posted @ 2019-02-10 20:01  散装英语king  阅读(219)  评论(0编辑  收藏  举报