94. 二叉树的中序遍历(力扣)

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
输入:root = [1,null,2,3]
输出:[1,3,2]

在这里插入代码片
# Definition for a binary tree node.
class TreeNode(object):
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

root = TreeNode(1) # 根节点
#root.left = TreeNode(5) # 根节点左边节点
root.right = TreeNode(2) # 根节点右边节点
root.right.left = TreeNode(3) # 根节点左边节点的左节点
# root.left.right = TreeNode(5) # 根节点左边节点的右节点
# root.right.right = TreeNode(22) # 根节点右边节点的右节点
# root.left.left.left = TreeNode(1) # 根节点左边节点的左节点的左节点

class Solution(object):
    def inorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        WHITE, GRAY = 0, 1
        res = []
        stack = [(WHITE, root)]
        while stack:
            print("stack:",stack)
            color, node = stack.pop()
            if node is None: continue
            if color == WHITE:
                stack.append((WHITE, node.right))
                stack.append((GRAY, node))
                stack.append((WHITE, node.left))
            else:
                res.append(node.val)
        return res

a=Solution().inorderTraversal(root)
print(a)#输出[1, 3, 2]

总体思路是(转自力扣):
其核心思想如下:
1使用颜色标记节点的状态,新节点为白色,已访问的节点为灰色。
2如果遇到的节点为白色,则将其标记为灰色,然后将其右子节点、自身、左子节点依次入栈。
3如果遇到的节点为灰色,则将节点的值输出。
注意:
前序遍历:中,左,右
中序遍历:左,中,右
后序遍历:左,右,中

本题需要中序遍历。

栈是一种 先进后出的结构,出栈顺序为左,中,右
那么入栈顺序必须调整为倒序,也就是右,中,左

同理,如果是前序遍历,入栈顺序为 右,左,中;后序遍历,入栈顺序中,右,左

你可能感兴趣的:(python,数据结构)