Day14 二叉树

# 二叉树的递归遍历

注意以下三种写法 :

第一种:

class Solution:
    def traversalHelper(self, root, result):
        if not root:
            return
        self.traversalHelper(root.left, result)
        result.append(root.val)
        self.traversalHelper(root.right, result)

    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        result = []
        self.traversalHelper(root, result)
        return result

第二种:

class Solution:
    def traversalHelper(self, root, result):
        if root:
            self.traversalHelper(root.left, result)
            result.append(root.val)
            self.traversalHelper(root.right, result)
        return result

    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        result = []
        return self.traversalHelper(root, result)

 第二种没什么必要。以上两种写法都可以写成闭包的。

 

# 二叉树的非递归遍历

使用栈来实现想要的过程。

中序遍历:

class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        # 迭代法
        if not root:
            return []

        stack = []
        result = []
        current = root

        while stack or current:
            while current:
                stack.append(current)
                current = current.left

            current = stack.pop()
            result.append(current.val)

            current = current.right
        
        return result

***看起来简单,实际上写起来容易漏洞百出***

此处,我们希望stack为空时停止,但是不希望第一次就停止。使用while stack or current:

可以规避这个问题。

同时,自己写的时候容易犯一个问题,对于从栈中弹出的元素重新获取左侧元素,这会导致重复与死循环。

# 二叉树的统一迭代

标记法,了解思路即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值