LeetCode94. 二叉樹的中序遍歷、前序144、後序145(棧實現迭代)

144. 二叉樹的前序遍歷

https://leetcode-cn.com/problems/binary-tree-preorder-traversal/

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

class Solution(object):
    def preorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if root is None:
            return []
        result = []
        stack = [root]

        # 需要一個標誌區分每個遞歸調用棧,這裏使用null來表示
        while stack:
            p = stack.pop()  # 訪問過的節點彈出
            if p is None:  # 空節點表示之前已經訪問過了,現在需要處理除了遞歸之外的內容
                p = stack.pop()  # 處理完了,第二次彈出節點(徹底從棧中移除)
                result.append(p.val)  # 此時p是null之前壓棧的一個節點,也就是上面stack.append(p)中的那個p
            else:
                if p.right:  # 右節點先壓棧,最後處理
                    stack.append(p.right)  # 先append的最後訪問
                if p.left:
                    stack.append(p.left)
                stack.append(p)  # 當前節點重新壓棧(留着以後處理),因爲先序遍歷所以最後壓棧
                stack.append(None)  # 在當前節點之前加入一個空節點表示已經訪問過了
        return result

94. 二叉樹的中序遍歷

https://leetcode-cn.com/problems/binary-tree-inorder-traversal/

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

class Solution(object):
    def inorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if root is None:
            return []
        result = []
        stack = [root]

        # 需要一個標誌區分每個遞歸調用棧,這裏使用null來表示
        while stack:
            p = stack.pop()  # 訪問過的節點彈出
            if p is None:  # 空節點表示之前已經訪問過了,現在需要處理除了遞歸之外的內容
                p = stack.pop()  # 處理完了,第二次彈出節點(徹底從棧中移除)
                result.append(p.val)  # 此時p是null之前壓棧的一個節點,也就是上面stack.append(p)中的那個p
            else:
                if p.right:  # 右節點先壓棧,最後處理
                    stack.append(p.right)  # 先append的最後訪問
                stack.append(p)  # 當前節點重新壓棧(留着以後處理),因爲先序遍歷所以最後壓棧
                stack.append(None)  # 在當前節點之前加入一個空節點表示已經訪問過了
                if p.left:
                    stack.append(p.left)
        return result

145. 二叉樹的後序遍歷 

https://leetcode-cn.com/problems/binary-tree-postorder-traversal/

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

class Solution(object):
    def postorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if root is None:
            return []
        result = []
        stack = [root]

        # 需要一個標誌區分每個遞歸調用棧,這裏使用null來表示
        while stack:
            p = stack.pop()  # 訪問過的節點彈出
            if p is None:  # 空節點表示之前已經訪問過了,現在需要處理除了遞歸之外的內容
                p = stack.pop()  # 處理完了,第二次彈出節點(徹底從棧中移除)
                result.append(p.val)  # 此時p是null之前壓棧的一個節點,也就是上面stack.append(p)中的那個p
            else:                
                stack.append(p)  # 當前節點重新壓棧(留着以後處理),因爲先序遍歷所以最後壓棧
                stack.append(None)  # 在當前節點之前加入一個空節點表示已經訪問過了
                if p.right:  # 右節點先壓棧,最後處理
                    stack.append(p.right)  # 先append的最後訪問
                if p.left:
                    stack.append(p.left)
        return result

參考題解

https://leetcode-cn.com/problems/binary-tree-postorder-traversal/solution/mo-fang-di-gui-zhi-bian-yi-xing-by-sonp/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章