1. 程式人生 > 實用技巧 >二叉樹層序遍歷問題總結

二叉樹層序遍歷問題總結

主要內容:

  • 不分行從上到下列印二叉樹
  • 分行從上到下列印二叉樹
  • 分行從下到上列印二叉樹
  • 之字形列印二叉樹
  • 二叉樹的右檢視

1. 不分行從上到下列印二叉樹

題目描述:從上到下打印出二叉樹的每個節點,同一層的節點按照從左到右的順序列印。

相關題目:劍指22;劍指18;

程式碼實現:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

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

    }

}
*/ // 即二叉樹的層序遍歷(藉助佇列結構) public class Solution { public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) { ArrayList<Integer> list = new ArrayList<>(); if(root == null) return list; Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root);
//根節點入隊 while(!queue.isEmpty()){ TreeNode curr = queue.poll(); list.add(curr.val); if(curr.left != null) queue.offer(curr.left); if(curr.right != null) queue.offer(curr.right); } return list; } }

2.分行從上到下列印二叉樹

題目描述:從上到下按層列印二叉樹,同一層的節點按照從左到右的順序列印,每一層列印到一行

相關題目:LeetCode102;

程式碼實現:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
 import java.util.Queue;
 import java.util.LinkedList;
 import java.util.ArrayList;
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if(root == null) return res;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            int levelnums = queue.size(); //計算每層的結點數目
            List<Integer> list = new ArrayList<>();
            for(int i = 0; i < levelnums; i++){
                TreeNode cur = queue.poll();
                list.add(cur.val);
                if(cur.left != null) queue.offer(cur.left);
                if(cur.right != null) queue.offer(cur.right);
            }
            res.add(list);
        }
        return res;      
    }
}

3.分行從下到上列印二叉樹

題目描述:給定一個二叉樹,返回其節點值自底向上的層次遍歷。 (即按從葉子節點所在層到根節點所在的層,逐層從左向右遍歷)

相關題目:LeetCode107;

程式碼實現:題目要求從下到上,只需要改變res.add(E e)方式,改為res.add(int index, E e)

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if (root == null) return res;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            int levelNums = queue.size();
            List<Integer> list = new ArrayList<>();
            for(int i = 0; i < levelNums; i++){
                TreeNode cur = queue.poll();
                list.add(cur.val);
                if(cur.left != null) queue.offer(cur.left);
                if(cur.right != null) queue.offer(cur.right);
            }
            res.add(0,list); //輸出是從上到下 還是 從下到上的關鍵
        }
        return res;
    }
}

4.之字形列印二叉樹

題目描述:之字形,即第一行按照從左到右的順序列印,第二層按照從右到左的順序列印,第三行再按照從左到右的順序列印,以此類推。

相關題目:LeetCode103;

程式碼實現:有了前面兩題的基礎,這個題就好解決了。只需要記錄一下層數,分情況使用ArrayList.add(E e)和ArrayList.add(int index, E e)。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if(root == null) return res;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        int level = 1; //初始化為第一層
        while(!queue.isEmpty()){
            int levelNums = queue.size();
            List<Integer> list = new ArrayList<>();
            for(int i = 0; i < levelNums; i++){
                TreeNode cur = queue.poll();
                // 判斷條件 (level & 1) 必須加括號
                if((level & 1) == 1){ //奇數層
                    list.add(cur.val);
                }else{ //偶數層
                    list.add(0,cur.val);
                }
                if(cur.left != null) queue.offer(cur.left);
                if(cur.right != null) queue.offer(cur.right);
            }
            res.add(list);
            level++;  //更新層數
        }
        return res;
    }
}

5.二叉樹的右檢視

題目描述:給定一棵二叉樹,想象自己站在它的右側,按照從頂部到底部的順序,返回從右側所能看到的節點值。

相關題目:LeetCode199;

程式碼實現:只將每層最後一個節點的值新增到ArrayList中返回。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if(root == null) return list;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            int levelNums = queue.size();
            for(int i = 0; i < levelNums; i++){
                TreeNode cur = queue.poll();
                if(i == levelNums - 1) list.add(cur.val);
                if(cur.left != null) queue.offer(cur.left);
                if(cur.right != null) queue.offer(cur.right);
            }
        }
        return list;
    }
}

時間複雜度,空間複雜度

參考:

☆☆☆LeetCode二叉樹的層序遍歷系列問題總結(佇列實現)https://blog.csdn.net/u014116780/article/details/82978934