LeetCode 94:二叉樹的中序遍歷 Binary Tree Inorder Traversal

題目:

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

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

示例:python

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

輸出: [1,3,2]
複製代碼

進階: 遞歸算法很簡單,你能夠經過迭代算法完成嗎?算法

Follow up: Recursive solution is trivial, could you do it iteratively?數組

解題思路:

百度百科:二叉樹的中序遍歷:baike.baidu.com/item/中序遍歷bash

遍歷順序:左子節點 --> 根節點 --> 右子節點數據結構

以下所示的二叉樹:app

A
     /   \
   B       C
 /  \     /  \
D    E   F    G
複製代碼

其遍歷順序爲:D -> B -> E -> A ->F -> C -> G函數

二叉樹遍歷能夠用 DFS(深度優先搜索)完成,其實現方式爲:遞歸或藉助數據結構 棧 迭代。學習

這種遍歷方式本質上是一個先進後出的棧式遍歷方式,遞歸方法實際也是用遞歸方式實現棧的先進後出。

DFS-遞歸:

Java:

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();//數組
        dfs_recursion(root, list);//傳入遞歸函數
        return list;
    }

    private void dfs_recursion(TreeNode node, List<Integer> list) {
        if (node == null) return;//基線條件
        dfs_recursion(node.left, list);//先遍歷左子節點
        list.add(node.val);//遍歷到左子節點的頂點,取出該節點的值
        dfs_recursion(node.right, list);//遞歸遍歷右節點
    }
}
複製代碼

Python3:

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        #數組
        res = list()
        #傳入遞歸函數
        self.dfs_recursion(root, res)
        return res

    def dfs_recursion(self, node: TreeNode, res: List[int]):
        #基線條件
        if not node: return
        #遞歸遍歷左子節點
        self.dfs_recursion(node.left, res)
        #取頂點節點的值
        res.append(node.val)
        #遞歸遍歷右子節點
        self.dfs_recursion(node.right, res)
複製代碼

DFS-迭代:

Java:

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();//數組
        if (root == null) return list;
        Stack<TreeNode> stack = new Stack<>();//用數據結構棧暫存節點
        TreeNode cur = root;//定義當前節點
        while (!stack.isEmpty() || cur != null) {//循環條件:棧不空或當前節點不空
            if (cur != null) {//當前節點不空時
                stack.push(cur);//當前節點入棧
                cur = cur.left;//刷新當前節點
            } else {//當前節點空時
                cur = stack.pop();//當前節點的父節點出棧
                list.add(cur.val);//數組存入節點的值
                cur = cur.right;刷新當前節點
            }
        }
        return list;
    }
}
複製代碼

Python:

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        #初始化數組、棧
        res, stack = list(), list()
        #當前節點指向根節點
        cur = root
        #遞歸條件爲:棧或當前節點非空
        while stack or cur:
            if cur:
                #當前節點非空時入棧
                stack.append(cur)
                #刷新當前節點
                cur = cur.left
            else:
                #當前節點爲空時其父節點出棧
                cur = stack.pop()
                #其值存入數組
                res.append(cur.val)
                #刷新當前節點
                cur =cur.right
        return res
複製代碼

一塊兒學習吖,歡迎關注:愛寫Bug

在這裏插入圖片描述
相關文章
相關標籤/搜索