# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param root TreeNode类 
# @return int整型一维数组
#
class Solution:
    #法1:递归法(左根右)
    # def inorder(self,root:TreeNode,res:List[int]):
    #     if not root:#当根为空时直接返回
    #         return 
    #     else:
    #         self.inorder(root.left,res)#左
    #         res.append(root.val)#根
    #         self.inorder(root.right,res)#右

    # def inorderTraversal(self , root: TreeNode) -> List[int]:
    #     # write code here
    #     res=[]
    #     if not root:#树为空直接返回答案
    #         return res
    #     self.inorder(root,res)
    #     return res

    #法2:根据栈的特性先进后出

    # 1.从根节点开始,每次优先进入每棵的子树的最左边一个节点,我们将其不断加入栈中,用来保存父问题。
    # 2:到达最左后,可以开始访问,如果它还有右节点,则将右边也加入栈中,之后右子树的访问也是优先到最左。
    def inorderTraversal(self , root: TreeNode) -> List[int]:
        # write code here
        res,stack = [],[]
        while root or stack:#当栈和当前节点都为空时停止循环

            #深度遍历,直到找到最左的节点,过程中的节点都加入栈中
            while root:
                stack.append(root)#父节点加入栈中
                root=root.left#继续深入左子树

            #取出栈顶元素
            stack_top=stack[-1]
            stack.pop()
            res.append(stack_top.val)

            #直接进入栈顶元素的右边节点,两种情况
            #1.栈顶元素有右子树,接下来会继续循环,
            #遍历该分支直到最左节点,并将过程中的节点加入栈中

            #2.栈顶元素没有右子树,接下来跳过找最左节点的循环,直接取栈顶元素
            root = stack_top.right
        return res