【LeetCode-二叉樹】二叉樹前序遍歷

HiDhl發表於2019-05-11

題目來源於 LeetCode 上第 144號(Binary Tree Preorder Traversal)問題:二叉樹的前序遍歷。題目難度為 Medium。

題目地址: https://leetcode.com/problems/binary-tree-preorder-traversal/

題目描述

Given a binary tree, return the preorder traversal of its nodes' values.

給定一個二叉樹,返回其節點值的前序遍歷

Input: [1,null,2,3]
   1
    \
     2
    /
   3
Output: [1,2,3]
複製程式碼

二叉樹的前序遍歷過程: 根節點 -> 左子樹 -> 右子樹,如下圖所示:

-w400

結果為: 4 2 1 3 6 5 7

題目解析

  1. 迴圈檢測棧是否為空,或者根節點是否為空
  2. 迴圈檢測左節點,儲存到棧中
  3. 當左節點遍歷結束之後,取出棧頂的右節點,再次執行步驟2

程式碼實現一(非遞迴)

class Solution {
    
    /**
     * 前序遍歷
     * @param root 根節點
     * @return 前序遍歷的集合
     */
    public List<Integer> preorderTraversal(TreeNode root) {
        Stack<TreeNode> stack = new Stack();
        List<Integer> list = new LinkedList();

        /**
         * 步驟1
         * 迴圈檢測棧是否為空,或者根節點是否為空
         */
        while(!stack.isEmpty() || root!=null){

            /**
             * 步驟2
             * 迴圈檢測左節點,儲存到棧中
             */
            while(root!=null){
                stack.push(root);
                list.add(root.val);
                root = root.left;
            }

            /**
             * 步驟3
             * 取出棧頂的右節點,再次執行步驟2
             */
            if(!stack.isEmpty()){
                root = stack.pop().right;
            }
        }
        return list;
    }

}
複製程式碼

程式碼實現二(遞迴)


class Solution {
    List<Integer> list = new LinkedList();
    public List<Integer> preorderTraversal(TreeNode root) {
        if (root == null) return list;
        list.add(root.val);
        preorderTraversal(root.left);
        preorderTraversal(root.right);
        return list;
    }
}

複製程式碼

相關文章

【LeetCode-陣列】查詢大多數元素

【LeetCode-陣列】陣列式整數加法

【LeetCode-棧】有效的括號

【LeetCode-連結串列】面試題-反轉連結串列

【LeetCode-二叉樹】二叉樹前序遍歷

相關文章