如何按層遍歷二叉樹【附java實現代碼】

說道遍歷二叉樹,我們很容易就會想到按照前序中序後序以及按層來遍歷二叉樹。

這篇博客主要是記錄一下按層來遍歷二叉樹的方法。

這個二叉樹按照層來遍歷的結果是

二叉樹的遍歷方法中,很多人最先想到的就是用遞歸的方法進行遍歷。二叉樹按層遍歷也同樣可以使用遞歸的方法進行遍歷,這種方法有兩個要點:1.要記錄當前遍歷的層數     2.每次遞歸的過程中判斷該層是否已經遍歷過

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

上面是二叉樹的結構定義。

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        //定義一個存放結果的數據結構
        List<List<Integer>> res = new ArrayList<>();
        if (null == root) {
            return res;
        }
        //用來記錄層數的計數器
        int count = 0;
        levelOrder(root,res,count);
        return res;
    }
    public void levelOrder(TreeNode root,List<List<Integer>> res,int count) {
        //如果遍歷的這個節點是空的則不需要操作和記錄
        if (null == root) {
            return;
        }
        List<Integer> list;
        if (count >= res.size()) {//如果是沒有遍歷過的層,則創建新的List存放節點
            list = new ArrayList<Integer>();
            //把這個新建的List放入存放結果的數據結構中
            res.add(list);
        } else {//如果是正在遍歷的層則從結果集中取出存放這層節點的List
            list = res.get(count);
        }
        //將節點的值放入List
        list.add(root.val);
        //遞歸地繼續去按照從左至右的遍歷節點的下一層
        levelOrder(root.left,res,count+1);
        levelOrder(root.right,res,count+1);
    }
}

按層遍歷二叉樹還可以藉助隊列來完成。這個方法的重點是每次將正在遍歷的節點從隊列中取出,並節點左右子樹放入隊列。

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if (null == root) {
            return res;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while (!queue.isEmpty()) {
            //記錄遍歷層的節點的數量
            int count = queue.size();
            List<Integer> list = new ArrayList<>();
            while (count > 0) { 
                //將節點從隊列中取出
                TreeNode temp = queue.poll();
                list.add(temp.val);
                //如果節點存在左右子樹,則將左右子樹放入隊列中
                if (null != temp.left) {
                    queue.add(temp.left);
                }
                if (null != temp.right) {
                    queue.add(temp.right);
                }
                //完成該節點的遍歷,則計數器-1
                count--;
            }
            res.add(list);
        }
        return res;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章