【94】二叉树的中序遍历

题目

给定一个二叉树的根节点 root ,返回它的 中序 遍历。

官方题解

法1:递归

这是在评论区看到的一个简洁写法。虽然用python递归效率不高,但很易懂。

extend也可以和" + "相互替代。

时间复杂度:O(n)。每个节点只会被遍历一次。

空间复杂度:O(n)。递归也是栈,会保存已经遍历了的节点。

class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        if not root:
            return []
        result=[]
        result.extend(self.inorderTraversal(root.left))
        result.append(root.val)
        result.extend(self.inorderTraversal(root.right))
        return result
class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        if not root:
            return []
        left=self.inorderTraversal(root.left)
        right=self.inorderTraversal(root.right)
        return left+[root.val]+right

 

Accepted

  • 70/70 cases passed (40 ms)
  • Your runtime beats 8.67 % of python3 submissions
  • Your memory usage beats 5.16 % of python3 submissions (15.1 MB)

法2:Morris遍历

将二叉树转化为链表,即每一个node都只可能有右孩子。

如果这个节点没有左孩子,则把x加入result,x=x.right。

如果这个节点有左孩子,找到左边的最后一个右节点,设为predecessor,设定predecessor的右孩子指向x,然后x左移,x=x.left,再循环判断。这一步相当于转换链表。

时间复杂度:O(n)

空间复杂度:O(1)

class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        result=[]
        while root:
            if not root.left:
                result.append(root.val)
                root=root.right
            else:
                # 找predecessor
                predecessor=root.left
                while predecessor.right:
                    predecessor=predecessor.right
                predecessor.right=root
                temp=root
                root=root.left
                temp.left=None
        return result

Accepted

  • 70/70 cases passed (28 ms)
  • Your runtime beats 88.27 % of python3 submissions
  • Your memory usage beats 82.09 % of python3 submissions (14.9 MB)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值