# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param root TreeNode类 
# @return int整型一维数组
#
class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:  # 迭代法1
        # write code here
        result = []
        st = []
        if root:
            st.append(root)
        while st:
            node = st.pop()
            if node != None:
                if node.right: #添加右节点(空节点不入栈)
                    st.append(node.right)
                
                st.append(node) #添加中节点
                st.append(None) #中节点访问过,但是还没有处理,加入空节点做为标记。
                
                if node.left: #添加左节点(空节点不入栈)
                    st.append(node.left)
            else: #只有遇到空节点的时候,才将下一个节点放进结果集
                node = st.pop() #重新取出栈中元素
                result.append(node.val) #加入到结果集
        return result

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:    # 迭代法2
        if not root:
            return []
        stack = []  # 不能提前将root结点加入stack中
        result = []
        cur = root
        while cur or stack:
            # 先迭代访问最底层的左子树结点
            if cur:     
                stack.append(cur)
                cur = cur.left  
            # 到达最左结点后处理栈顶结点    
            else:  
                cur = stack.pop()
                result.append(cur.val)
                # 取栈顶元素右结点
                cur = cur.right 
        return result

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:  # 递归法
        # write code here
        if root is None: return None
        result = []
        def traversal(root: TreeNode):
            if root is None:
                return None
            if root.left: traversal(root.left)
            result.append(root.val)
            if root.right: traversal(root.right)
        traversal(root)
        return result