1. 程式人生 > >leetcode 之Binary Tree Level Order Traversal I和II 解題思路

leetcode 之Binary Tree Level Order Traversal I和II 解題思路

題目如下:

Binary Tree Level Order Traversal I


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]
]
解題思路:

層次遍歷的時候需要藉助輔助資料結構--佇列。每一層用null節點區分一下。當刪除佇列的頭節點時,需要判斷當前節點是否為null,如果為null,說明該層已經結束,需要新建一個arraylist,同時需要再佇列尾部新增null,用來區分下一層。但是需要注意的是,如果當前null為最後一個節點時,就不需要再在尾部新增null了,否則就會陷入死迴圈了。

程式碼如下:

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> list = new ArrayList<List<Integer>>();
        if(root == null) return list;
        LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
        queue.add(root);
        queue.add(null);
        List<Integer> sublist = new ArrayList<Integer>();
        while(queue.size() > 0){
            TreeNode node = queue.remove();
            if(node != null){
                sublist.add(node.val);
                if(node.left != null) queue.add(node.left);
                if(node.right != null) queue.add(node.right);
            }else{
                list.add(sublist);
                if(queue.size() > 0){
                    sublist = new ArrayList<Integer>();
                    queue.add(null);
                }
                
            }
        }
        return list;
        
    }
}

Binary Tree Level Order Traversal II


Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root).

For example:
Given binary tree {3,9,20,#,#,15,7},

    3
   / \
  9  20
    /  \
   15   7

return its bottom-up level order traversal as:

[
  [15,7],
  [9,20],
  [3]
]
解法與I相同,只不過將最後結果翻轉一下即可。這裡的做法是,採用頭插法。

程式碼如下:

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> list = new ArrayList<List<Integer>>();
        if(root == null) return list;
        LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
        queue.add(root);
        queue.add(null);
        List<Integer> sublist = new ArrayList<Integer>();
        while(queue.size() > 0){
            TreeNode node = queue.remove();
            if(node != null){
                sublist.add(node.val);
                if(node.left != null) queue.add(node.left);
                if(node.right != null) queue.add(node.right);
            }else{
                list.add(0,sublist);//和I相比只有這裡不同
                if(queue.size() > 0){
                    sublist = new ArrayList<Integer>();
                    queue.add(null);
                }
                
            }
        }
        return list;
    }
}