劍指Offer-->從上向下打印二叉樹(層序遍歷 + 詳解)

    這道題目難度一般,重要的是想到以隊列作爲輔助來解決。
    分析:因爲按層打印的順序決定了先打印的應該爲根結點。爲了接下來能夠打印值爲 8 的結點的兩個子結點,應該在遍歷到該結點時把值爲 6 和 10 的兩個結點保存到一個容器裏,此時容器中含有 6 和 10 兩個結點。按照從左到右的要求,先取出值爲 6 的結點。打印出值 6 之後分別把 5 和 7 兩個左右子結點放入容器 ,此時容器中的結點有三個,分別是10 、 5 和 7 。接下來我們從容器中取出值爲 10 的結點,注意到 10 比另外兩個元素先進入,因此先將 10 取出,並再把 10 的兩個結點放入,此時容器中的元素爲 5 、 7 、 9 、 11。由此可以看出取元素的順序符合先進先出原則,我們則判斷需要通過隊列來解決這個問題。由於這四個結點都沒有子結點,因此只需要依次打印即可。打印過程如圖所示:
     
    
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Queue;

/**
 * Created by zhangshuyou on 2015/5/22.
 */

/**
 * 題目描述:
 * 從上往下打印出二叉樹的每個節點,同層節點從左至右打印(即層序遍歷)
 * 1.元素 8 出隊,放入list,得到 6 、 10
 * 2.元素 6 出隊,放入list,得到 (10) 5 、7
 * 3.元素 10 出隊,放入list,得到 (5) (7) (9) (11)
 * 4.均無子結點,直接打印
 */
public class Solution {
    //建立一個數組雙端隊列,是大小可變數組。線程不安全,但在速度上有一定的優勢。
    Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
    ArrayList<Integer> list = new ArrayList<Integer>();

    public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
        if(root == null)
            return list;
        queue.add(root);  //將結點入隊
        while(!queue.isEmpty()){
            TreeNode treeNode = queue.poll(); //將元素出隊並保存
            list.add(treeNode.val); //將元素的值取到並添加到集合中

            if(treeNode.left != null)
                queue.add(treeNode.left);
            if(treeNode.right != null)
                queue.add(treeNode.right);
        }
        return list;
    }
}

class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

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


發佈了51 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章