1. 程式人生 > >LeetCode:二叉樹的前序遍歷【144】

LeetCode:二叉樹的前序遍歷【144】

LeetCode:二叉樹的前序遍歷【144】

題目描述

給定一個二叉樹,返回它的 前序 遍歷。

 示例:

輸入: [1,null,2,3]  
   1
    \
     2
    /
   3 

輸出: [1,2,3]

題目分析

  如果用遞迴程式碼的話,很簡單,先序遍歷,就是先遍歷當前節點,接著是左孩子然後是右孩子,到每個孩子都是這樣的處理過程。

    public void preorder(TreeNode root,List<Integer> res)
    {
        if(root==null)
            return;
        res.add(root.val);
        preorder(root.left,res);
        preorder(root.right,res);
    }
    

  但是這道題,我們可以用棧來模擬遞迴的過程,從而加深對遞迴的理解程度。隨便找一個二叉樹,我們來手工模擬一下這個出入棧過程:

   

  剛開始的時候1在棧內,也在棧頂。列印完1以後,我們需要把它的兩個孩子加入到棧中,此時有一個問題,我們需要先加左還是先加右?

  我們需要把下一個需要列印的元素髮在棧頂,如果先加左孩子的話,那麼右孩子就會處於棧頂,此時列印棧頂的話就是右孩子的值3,所以棧要先加右孩子,再加左孩子

  所以過程是:【1入棧】、1出棧列印輸出1

        【3入棧、2入棧】,2出棧列印輸出2,然後【4入棧】,4出棧列印輸出4,3出棧列印輸出3.

Java題解

public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        if(root==null)
            return res;
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while (!stack.empty())
        {
            TreeNode node = stack.pop();
            res.add(node.val);
            if(node.right!=null)
                stack.push(node.right);
            if(node.left!=null)
                stack.push(node.left);
        }
        return res;
}