1. 程式人生 > 其它 >leetcode第144、94、145——二叉樹的前序遍歷、中序遍歷、後序遍歷

leetcode第144、94、145——二叉樹的前序遍歷、中序遍歷、後序遍歷

技術標籤:資料結構和演算法leetcode二叉樹演算法

1.前序遍歷

給你二叉樹的根節點 root ,返回它節點值的 前序 遍歷。

在這裡插入圖片描述

示例 1:
輸入:root = [1,null,2,3]
輸出:[1,2,3]

1.1 遞迴解法

# Definition for a binary tree node.
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
class
Solution: def preorderTraversal(self, root: TreeNode) -> List[int]: 遞迴解法 if root is None: return [] res = [root.val] if root.left: res.extend(self.preorderTraversal(root.left)) if root.right: res.extend(self.
preorderTraversal(root.right)) return res

1.2 迭代解法

# Definition for a binary tree node.
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


class Solution:
    def preorderTraversal(self, root: TreeNode)
-> List[int]: # 迭代解法 if root is None: return [] res = [] stack = [root] while stack: a = stack.pop() if a: res.append(a.val) # 棧先進後出,所以先壓入右子樹再壓入左子樹 if a.right: stack.append(a.right) if a.left: stack.append(a.left) return res

2.中序遍歷

給定一個二叉樹的根節點 root ,返回它的 中序 遍歷。
在這裡插入圖片描述
輸入:root = [1,null,2,3]
輸出:[1,3,2]

2.1 遞迴解法

# Definition for a binary tree node.
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        # 1.遞迴解法
        if root is None:
            return []
        res = []
        res.extend(self.inorderTraversal(root.left))
        res.append(root.val)
        res.extend(self.inorderTraversal(root.right))
        return res

2.2 迭代解法

# Definition for a binary tree node.
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        # 2.迭代解法
        if root is None:
            return []
        res = []
        t = type(root)
        stack = [root]
        while stack:
            a = stack.pop()
            if type(a) != t and a is not None:
                # 如果a不是樹,且a不為空,則代表a是val值,新增到結果列表
                res.append(a)
                continue
            if a:
                # 中序遍歷順序: 左、根、右,故入棧順序為: 右、根、左
                stack.append(a.right)
                stack.append(a.val)
                stack.append(a.left)
        return res

3.後續遍歷

給定一個二叉樹,返回它的 後序 遍歷。
在這裡插入圖片描述

示例:
輸入: [1,null,2,3]
輸出: [3,2,1]

3.1 遞迴解法

# Definition for a binary tree node.
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


class Solution:
    def postorderTraversal(self, root: TreeNode) -> List[int]:
        # 1.遞迴解法
        if root is None:
            return []
        res = []
        res.extend(self.postorderTraversal(root.left))
        res.extend(self.postorderTraversal(root.right))
        res.append(root.val)
        return res

3.2 迭代解法

# Definition for a binary tree node.
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


class Solution:
    def postorderTraversal(self, root: TreeNode) -> List[int]:
        # 2.迭代解法
        if root is None:
            return []
        t = type(root)
        res = []
        stack = [root]
        
        while stack:
            a = stack.pop()
            if type(a) != t and a is not None:
                # a型別不是樹,且不為空,表示是val
                res.append(a)
                continue
            if a:
                # 後續遍歷順序: 左、右、根。故入棧順序應該為: 根、右、左
                stack.append(a.val)
                stack.append(a.right)
                stack.append(a.left)
        return res