把二叉樹打印成多行

來源:我是碼農,轉載請保留出處和鏈接!

本文鏈接:http://www.54manong.com/?id=1233

題目描述

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

image.png

image.png

void BinaryTreeLevelOrder(BTNode* root)
{
    Queue q;
    //樹爲空,直接返回
    if (root == NULL)
    {
        return;
    }
    QueueInit(&q);
    //先將根節點入隊
    QueuePush(&q, root);
    while (QueueEmpty(&q))
    {
        //出隊保存隊頭並訪問
        BTNode* front = QueueFront(&q);
        printf("%c", front->_data);
        QueuePop(&q);
        //將出隊結點的左子樹根入隊
        if (front->_left)
            QueuePush(&q, front->_left);
        //將出隊結點的右子樹根入隊
        if (front->_right)
            QueuePush(&q, front->_right);
    }
}

利用遞歸的方法進行先序遍歷,傳遞深度,遞歸深入一層擴容一層數組,先序遍歷又保證了同層節點按從左到右入數組,十分巧妙!!!

他在不斷地擴容,最後答案類似這樣{{1},{2,3},{4,5,6}}

多傳遞一個當前結點所在層次就可以用前序遍歷實現了,學習了

假如現在元素是[1,2,3],當進入2時會創建一個 arraylist,此時 depth = 2,size=2;當2遍歷完後會進入3,此時3 就不用創建 arraylist 了,因爲 2,3是同一層的,並且此時 depth==size 。這個判斷是用來讓最左的元素創建 arraylist 就行了,而同一層後邊的元素共用這個 arraylist

利用遞歸的方法進行先序遍歷,傳遞深度,遞歸深入一層擴容一層數組,先序遍歷又保證了同層節點按從左到右入數組,十分巧妙!!!

代碼實現如下:

//用遞歸做的
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;
        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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章