题目
给定一个二叉树的根节点
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)