LeetCode 94、144、145*. 二叉樹的遍歷(Python)

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

 示例:

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

1
   \
     2
   /

輸出: [1,2,3]

 

思路:遞歸很簡單,這裏用迭代法,使用棧模擬計算機中的指令執行情況。

1. 先創建一個Command類,存儲一個字符串和一個樹節點,其中字符串表示什麼命令,“go”代表跳轉到某個節點,“print”表示打印輸出;

2. 由於是先序遍歷,所以跳轉到某個節點時先從棧頂彈出一條命令執行;

3. 如果彈出的命令是“print”則append進結果,如果是go命令則先向棧中壓入“go” Command中存儲的節點的右子節點命令,再壓入“go” Command中存儲的節點的左子節點命令,最後壓入“print” Command中存儲的節點的命令;

4. 最終返回結果數據即可。

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

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

        stack.append( Command("go", root) )

        while len(stack)!= 0:
            command = stack.pop()

            if command.s == "print":
                result.append(command.node.val)
            else:
                if command.s == "go" and command.node.right:
                    stack.append( Command("go", command.node.right) )
                if command.s == "go" and command.node.left:
                    stack.append( Command("go", command.node.left) )
                stack.append( Command("print", command.node) )
        
        return result

 

 

對於第94題的中序遍歷,只需改變入棧順序即可

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

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

        stack.append( Command("go", root) )

        while len(stack)!= 0:
            command = stack.pop()

            if command.s == "print":
                result.append(command.node.val)
            else:
                if command.s == "go" and command.node.right:
                    stack.append( Command("go", command.node.right) )
                stack.append( Command("print", command.node) )
                if command.s == "go" and command.node.left:
                    stack.append( Command("go", command.node.left) )
                
        
        return result

 

對於第145題的後序遍歷,只需改變入棧順序即可

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

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

        stack.append( Command("go", root) )

        while len(stack)!= 0:
            command = stack.pop()

            if command.s == "print":
                result.append(command.node.val)
            else:
                stack.append( Command("print", command.node) )
                if command.s == "go" and command.node.right:
                    stack.append( Command("go", command.node.right) )
                if command.s == "go" and command.node.left:
                    stack.append( Command("go", command.node.left) )
                
        
        return result

 

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