LeetCode_94_二叉樹的中序遍歷_hn

題目描述

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

示例:

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

輸出: [1,3,2]

解答方法

方法一:遞歸

代碼

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        if root:
            return self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)
        else:
            return[]

時間復(fù)雜度

T(n)=2T(n/2)+1

空間復(fù)雜度

最壞情況下需要空間O(n),平均情況為O(logn)

提交結(jié)果

Runtime: 36 ms, faster than 71.47% of Python3 online submissions for Binary Tree Inorder Traversal.
Memory Usage: 13.7 MB, less than 6.56% of Python3 online submissions for Binary Tree Inorder Traversal.

方法二:基于棧的遍歷

代碼

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        res = []
        stack = []
        p = root
        while p or stack:
            while p:
                stack.append(p)
                p = p.left
            p = stack.pop()
            res.append(p.val)
            p = p.right
        return res

時間復(fù)雜度

O(n)

空間復(fù)雜度

O(n)

提交結(jié)果

Runtime: 40 ms, faster than 37.12% of Python3 online submissions for Binary Tree Inorder Traversal.
Memory Usage: 13.9 MB, less than 6.56% of Python3 online submissions for Binary Tree Inorder Traversal.

方法三:莫里斯遍歷

代碼

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        res = []
        current = root
        while current is not None:
            if current.left is None:
                res.append(current.val)
                current = current.right
            else:
                pre = current.left
                while pre.right is not None:
                    pre = pre.right
                pre.right,current.left, current = current, None,  current.left
                
        return res

時間復(fù)雜度

O (n )。想要證明時間復(fù)雜度是O (n ),最大的問題是找到每個節(jié)點的前驅(qū)節(jié)點的時間復(fù)雜度。乍一想,找到每個節(jié)點的前驅(qū)節(jié)點的時間復(fù)雜度應(yīng)該是O (nlogn ),因為找到一個節(jié)點的前驅(qū)節(jié)點和樹的高度有關(guān)。
但事實上,找到所有節(jié)點的前驅(qū)節(jié)點只需要O (n )時間。一棵?個節(jié)點的二叉樹只有?- 1條邊,每條邊只可能使用2次,一次是定位節(jié)點,一次是找前驅(qū)節(jié)點。
故復(fù)雜度為O (n )。

空間復(fù)雜度

O (n )。使用了長度為?的數(shù)組。

提交結(jié)果

Runtime: 40 ms, faster than 37.12% of Python3 online submissions for Binary Tree Inorder Traversal.
Memory Usage: 13.9 MB, less than 6.56% of Python3 online submissions for Binary Tree Inorder Traversal.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容