一、题目描述
给定一个二叉树的根节点 root
,返回 它的 中序 遍历 。
二、解题思路过程
递归1:最好理解的方式
class Solution:
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
if not root:
return []
return []+self.inorderTraversal(root.left)+[root.val]+self.inorderTraversal(root.right)
递归2:可以适应不同的题目,添加参数、增加返回条件、修改进入递归条件、自定义返回值
class Solution:
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
def tree(n):
if not n:
return
tree(n.left)
res.append(n.val)
tree(n.right)
res=[]
tree(root)
return res
三、复杂度分析
时间复杂度:,n为节点数,访问每个节点恰好一次。
空间复杂度:空间复杂度:,h为树的高度。最坏情况下需要空间
,平均情况为
四、进阶思路分析
递归算法很简单,你可以通过迭代算法完成吗?
颜色标记法:
- 使用颜色标记节点的状态,新节点为黄色,已访问的节点为绿色。
- 如果遇到的节点为黄色,则将其标记为绿色,然后将其右子节点、自身、左子节点依次入栈。
- 如果遇到的节点为绿色,则将节点的值输出。
class Solution:
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
YELLOW,GREEN=0,1 # 使用颜色进行标记
res=[]
stack=[(YELLOW,root)] # 将未遍历过的节点标记为黄色
while stack:
color,node=stack.pop()
if node is None:continue
if color==YELLOW:
'''
如果这个节点为黄色,
则首先把这个节点的右节点标记为黄色
然后再把这个节点标记为绿色
最后把这个节点的右节点标记为黄色
'''
stack.append((YELLOW,node.right))
stack.append((GREEN,node))
stack.append((YELLOW,node.left))
else: # 如果这个节点为绿色
res.append(node.val) # 直接把这个节点添加到结果中
return res
五、题目来源
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/binary-tree-inorder-traversal