二叉树的中序遍历
题目描述:

解题思路:
- 第一种:递归。又是递归,可以发现很多题都可以用到递归的思路…。二叉树的中序遍历,这里不太了解的可以看看这个博客:二叉树遍历,总结了二叉树的所有遍历情况。这道题所说的中序遍历,就是按照这个顺序:左子树—> 根结点 —> 右子树的顺序来遍历的。那么递归就很好写了,我还是设了一个函数
TraverseTree
来递归,然后还定义了一个数组result
来依次保存遍历的数。我们按照刚才所说的遍历顺序,先对左子树,也就是tree.left
进行遍历,再保存根节点,再遍历右子树,很容易就可以写出来。 - 时间复杂度:O(N)
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return []
result = []
self.TraverseTree(root, result)
return result
def TraverseTree(self, tree, l):
if tree.left:
self.TraverseTree(tree.left, l)
l.append(tree.val)
if tree.right:
self.TraverseTree(tree.right, l)

- 第二种:迭代遍历,也叫做堆栈法。思路和上一种也类似,我们定义两个数组
result
和temp
分别来保存最后要输出的中序遍历数组和当前的数组。通过看代码也很容易理解,这里刚开始遍历的时候,如果二叉树不为空,就会一直往往左子树走,每次都会将当前左子树append
到temp
里,这里就类似于把所有左子树压到栈中,最后如果没有左子树了,那么就会将最左的元素,也就是temp
的第一个元素pop
出来,这个数也就是所求中序遍历的第一个数,然后把这个数加到要输出的result
里,这个时候我们就开始从当前这个子结点找右子树,从该右子树的左结点又继续刚才的操作。 - 时间复杂度:O(N)
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return []
result = []
temp = []
while root or temp:
if root:
temp.append(root)
root = root.left
else:
root = temp.pop()
result.append(root.val)
root = root.right
return result
