從上到下按層打印二叉樹,同一層結點從左至右輸出。每一層輸出一行。


import java.util.*;

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

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

    }

}
*/
/*
    層序遍歷,但是使用start、end來記錄每層的節點數
    注意end值一直在更新,當每一層的結點值被取出時,end更新,更新之后為下一層的節點存儲
    做准備。第一層1個,end = 1
*/

public class Solution {
    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
        if(pRoot == null){
            return result;
        }
        Queue<TreeNode> layer = new LinkedList<TreeNode>();
        ArrayList<Integer> layerList = new ArrayList<Integer>();
        layer.add(pRoot);
        int start = 0, end = 1;
        while(!layer.isEmpty()){
            TreeNode cur = layer.remove();
            layerList.add(cur.val);
            start++;
            if(cur.left!=null){
                layer.add(cur.left);           
            }
            if(cur.right!=null){
                layer.add(cur.right);
            }
            if(start == end){
                end = layer.size();
                start = 0;
                result.add(layerList);
                layerList = new ArrayList<Integer>();
            }
        }
        return result;
    }
}

以上是一種常規思路,要掌握。下面是一種遞歸方法。

鏈接:https://www.nowcoder.com/questionTerminal/445c44d982d04483b04a54f298796288?f=discussion
來源:牛客網

public class Solution {
    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> list = new ArrayList<>();
        depth(pRoot, 1, list);
        return list;
    }
     
    private void depth(TreeNode root, int depth, ArrayList<ArrayList<Integer>> list) {
        if(root == null) return;

      //當深度增加的時候,如果當前list中的ArrayList<Integer>>(存每層數)不夠,則增加一個新的存,
      //如果夠了,就接着存進最新的哪個ArrayList<Integer>>即可。比如第三層,四個數都存在第三個
      //ArrayList<Integer>>中

if(depth > list.size())
            list.add(new ArrayList<Integer>());
        list.get(depth -1).add(root.val);
         
        depth(root.left, depth + 1, list);
        depth(root.right, depth + 1, list);
    }
}

使用list.get(depth-1)獲取對應位置的存儲ArrayList<Integer>,然后將本層的結點值存入。list下標從0開始。list.get(0)存第一層

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM