二叉樹的按層遍歷

題目:

有一棵二叉樹,請設計一個算法,按照層次打印這棵二叉樹。

給定二叉樹的根結點root,請返回打印結果,結果按照每一層一個數組進行儲存,所有數組的順序按照層數從上往下,且每一層的數組內元素按照從左往右排列。保證結點數小於等於500。


解題思路:

1.新建一個隊列,將頭結點壓入隊列。2個變量,last和nlast。last表示當前行的最右節點,初始值爲頭節點。nlast表示下一行的最右節點,初始值爲空。

2.從隊列中彈出隊頭元素top,並將top加入list1(用來存儲每層的樹節點)中。當top的左孩子存在時,將top的左孩子加入隊列,nlast=top的左孩子。當top的右孩子存在時,將top的右孩子加入隊列,nlast=top的右孩子。當top=last時說明該換行了。

3.重複2直至隊列爲空。

注意的是題目要求按行來打印樹,所以List<TreeNode> list1來存儲每層的樹節點。List<List<TreeNode>> list來存儲整棵樹的節點。當top=last,時將list1加入到list中,並新建list1。


Java代碼:

import java.util.*;


/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}*/
public class TreePrinter {
    public int[][] printTree(TreeNode root) {
        /*
        1.需要一個隊列,將頭結點入隊列。需要2個變量,last表示當前行的最右節點,nlast表示下一行的最右節點。
        last初始值爲頭結點,nlast初始值爲null。
        2.將隊列的元素top移除並打印,將top的左孩子入隊,nlast更新,top的右孩子入隊列,nlast持續更新。當top等於
        last時說明該換行了。令last=nalst.
        3.重複2的操作,直到隊列爲空。
        因爲題目要求按層打印樹,所以需要List<List<TreeNode>>。裏邊的尖括號用來存儲一層的樹,外邊的尖括號用來存儲
        各層的樹。
        */
        if(root==null) return null;
        TreeNode last=root;
        TreeNode nlast=null;
        Queue<TreeNode> queue=new LinkedList<TreeNode>();//隊列用linkedlist,不用ArrayList。不然會出錯
        List<List<TreeNode>> list=new ArrayList<List<TreeNode>>();
        List<TreeNode> list1=new ArrayList<TreeNode>();
        queue.offer(root);
        while(!queue.isEmpty())
        {
            TreeNode top=queue.poll();//取出隊頭元素
            list1.add(top);
            if(top.left!=null)
                {
                queue.offer(top.left);
                nlast=top.left;
            }
             if(top.right!=null)
                 {
                 queue.offer(top.right);
                 nlast=top.right;
             }
            if(top==last)//說明要換行了
                {
                list.add(list1);
                list1=new ArrayList<TreeNode>();//注意將list1加入list後,list1要更新
                last=nlast;  
            }
            
        }
       int [][]res=new int[list.size()][] ;
        for(int i=0;i<list.size();i++)
            
        {
            res[i]=new int[list.get(i).size()];
            for(int j=0;j<list.get(i).size();j++)
            {
            res[i][j]=list.get(i).get(j).val;
        }
        }
        return res;
    }
}

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