二叉树的中序遍历模板 包括递归,迭代,莫里斯遍历

# 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
class Solution(object):
    def inorderTraversal(self, root):
        """
        :type root: Optional[TreeNode]
        :rtype: List[int]
        """
        # res = []
        # cur = root
        # stack = []
        # while cur or stack:
        #     while cur:
        #         stack.append(cur)
        #         cur = cur.left
        #     cur = stack.pop()
        #     res.append(cur.val)
        #     cur = cur.right
        # return res

        # 最容易版本
        # if not root:
        #     return []

        # return self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)
        

        # 递归通用模板,适应不同题型,添加参数,返回条件,修改进入递归条件,自定义返回值
        # def dfs(cur):
        #     if not cur:
        #         return 
            
        #     dfs(cur.left)
        #     res.append(cur.val)
        #     dfs(cur.right)
        # res=[]
        # dfs(root)
        # return res

        # 迭代的层序遍历
        # if not root:
        #     return []
        # cur ,res = [root] , []
        # while cur:
        #     lay ,layval = [],[]
        #     for node in cur:
        #         layval.append(node.val)
        #         if node.left: lay.append(node.left)
        #         if node.right: lay.append(node.right)
        #     cur = lay
        #     res.append(layval)
        # return res

        # 迭代的前中后序遍历  中序遍历
        # cur = root
        # stack = []
        # res = []
        # while cur or stack:
        #     while cur:
        #         stack.append(cur)
        #         cur = cur.left
        #     cur = stack.pop()
        #     res.append(cur.val)
        #     cur = cur.right


        # 使用栈的前序遍历
        # cur = root
        # res ,stack = [], [] 
        # while cur or stack:

        #     while cur:
        #         stack.append(cur)
        #         res.append(cur.val)
        #         cur= cur.left
        #     cur = stack.pop()
        #     cur = cur.right
        # return res

        # # 后续遍历 先按照右左中的顺序,然后反过来
        # cur = root
        # res ,stack = [], [] 
        # while cur or stack:

        #     while cur:
        #         stack.append(cur)
        #         res.append(cur.val)
        #         cur= cur.right
        #     cur = stack.pop()
        #     cur = cur.left
        # return res[::-1]
        # return res



        # 标记迭代法 中序遍历 
        # stack = []
        # res = []
        # stack.append((0,root))
        # while stack:
        #     flag , cur = stack.pop()
        #     if not cur: continue
        #     if flag == 0:
        #         stack.append((0,cur.right))
        #         stack.append((1,cur))
        #         stack.append((0,cur.left))
        #     else:
        #         res.appned(cur.val)
        # return res

        # 莫里斯遍历
        # 
        # res = []

        # while root:
        #     if root.left:
        #         pre = root.left
        #         while pre.right:
        #             pre = pre.right
        #         pre.right = root
        #         tmp = root
        #         root = root.left
        #         tmp.left = None
        #     else:
        #         res.append(root.val)
        #         root = root.right

        # return res

        res = []
        while root:
            if root.left:
                pre = root.left
                while pre.right:
                    pre = pre.right
                pre.right = root
                # 在前序遍历中,首次访问节点时就添加其值
                res.append(root.val)
                tmp = root
                root = root.left
                tmp.left = None
            else:
                # 左指针为空时,除了移动到右子树,也要添加节点值
                res.append(root.val)
                root = root.right

        return res

    












记住遍历模板,走遍天下都不怕

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值