力扣 二叉树中序遍历 (非递归) Python

# 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

测试系统已经定义好了结点,结点值是 int 类型,如果没有 L/R,其值为 None 而不是样例给的 null

我的想法大致流程就是:

  1. (while) 一路进入左子树 (同时其父结点进栈),直到看到左叶结点并记录进 result 为止
  2. 把当前结点的 val 记录进 result
  3. (while) 一路取出栈里面没有右孩子的结点,边取边记录 val
  4. 结点有右孩子时,如果是叶结点就记录进 result,不是就作为下一次循环的访问点
class Solution(object):
    def inorderTraversal(self, root):
        stack, result, visit = [], [], root
        while visit:
            # 存在左孩子时
            while visit.left:
                # 左孩子 -> 叶结点
                if isinstance(visit.left, int):
                    result.append(visit.left)
                # 左孩子 -> 子树
                else:
                    # 当前结点进栈,访问左孩子
                    stack.append(visit)
                    visit = visit.left
            # 访问根结点
            result.append(visit.val)
            # 栈不为空、访问的结点无右孩子
            while stack and not visit.right:
                visit = stack.pop()
                result.append(visit.val)
            # 右孩子 -> 叶结点
            if isinstance(visit.right, int):
                result.append(visit.right)
            # 右孩子 -> 子树
            else:
                visit = visit.right
        return result

力扣的测试感觉不太准,多次测试波动有点大

力扣 二叉树中序遍历 (非递归) Python_第1张图片

你可能感兴趣的:(数据结构与算法,leetcode,算法,python,b树)