zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Leetcode: Binary Tree Level Order Traversal

LeetCode Tree Binary order level Traversal
2023-09-11 14:14:08 时间
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,#,#,15,7},
    3
   / \
  9  20
    /  \
   15   7
return its level order traversal as:
[
  [3],
  [9,20],
  [15,7]
]

Best approach:

 1 class Solution {
 2     public List<List<Integer>> levelOrder(TreeNode root) {
 3         List<List<Integer>> res = new ArrayList<> ();
 4         if (root == null) return res;
 5         Queue<TreeNode> queue = new LinkedList<TreeNode>();
 6         queue.offer(root);
 7         while (!queue.isEmpty()) {
 8             int size = queue.size();
 9             List<Integer> row = new ArrayList<>();
10             for (int i = 0; i < size; i ++) {
11                 TreeNode node = queue.poll();
12                 row.add(node.val);
13                 if (node.left != null) {
14                     queue.offer(node.left);
15                 }
16                 if (node.right != null) {
17                     queue.offer(node.right);
18                 }
19             }
20             res.add(row);
21         }
22         return res;
23     }
24 }

把树看成一个有向图,进行BFS。BST的通常做法都是维护一个队列。这道题的难度在于,如何在队列不断的入队出队操作中,确定哪些node是一个层次的。想了很久没什么好办法,参考了网上的做法,发现他在维护两个数:一个是父节点所在层次的节点在当前队列中的数目ParentNumInQ,另一个是子节点所在层次的节点在当前队列中的数目ChildNumInQ。初始数值为1和0. 每次父节点出队,ParentNumInQ--,每次子节点入队,ParentNumInQ++。一旦ParentNumInQ减至0,说明当前父节点层次已全部出队,全部被存入LinkedList中,这就得到了一层的所有节点。接下来需要一些更新,ParentNumInQ = ChildNumInQ, ChildNumInQ = 0开始考虑下一层。

 1 /**
 2  * Definition for binary tree
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 public class Solution {
11     public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) {
12         ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>> ();
13         if (root == null) return lists;
14         LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
15         queue.add(root);
16         int ParentNumInQ = 1;
17         int ChildNumInQ = 0;
18         ArrayList<Integer> list = new ArrayList<Integer>();
19         while (!queue.isEmpty()) {
20             TreeNode cur = queue.poll();
21             list.add(cur.val);
22             ParentNumInQ--;
23             if (cur.left != null) {
24                 queue.add(cur.left);
25                 ChildNumInQ++;
26             }
27             if (cur.right != null) {
28                 queue.add(cur.right);
29                 ChildNumInQ++;
30             }
31             if (ParentNumInQ == 0) {
32                 ParentNumInQ = ChildNumInQ;
33                 ChildNumInQ = 0;
34                 lists.add(list);
35                 list = new ArrayList<Integer>();
36             }
37         }
38         return lists;
39     }
40 }