二叉树中序遍历的思想跟前序遍历相似,也是可以有递归和迭代两种解法。其中需要注意的是前序遍历的迭代过程仅仅关注根结点即可,即不断锁定新的根节点位置,因为前序遍历的过程为根左右,而中序遍历则需要先把二叉树所有节点的左结点先压入栈中,然后再逐一弹出左结点和根结点,最后是右结点。
示例1:
还是根据示例1给出递归和迭代两种方法的代码。
代码:
递归法:
class Solution:
def inorderTraversal(self, root):
if root is None:
return []
return self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)
迭代法:
class Solution:
def inorderTraversal(self, root):
stack = []
result = []
while root or stack:
while root:
stack.append(root)
root = root.left
root = stack.pop()
result.append(root.val)
root = root.right
return result
分析迭代法:
(1) while root部分主要是判断三种情况:
一是root一开始即为None 直接结束输出[];
二是root在迭代过程中到了一个空的左指针,即无左结点的时候跳出循环,此时所有结点的左结点全部压入栈中,可以开始pop操作了;
三是迭代过程中到了一个空的右指针,即某个结点无右结点,此时直接退出循环,pop出栈中最上面的结点即可继续迭代。
(2) stack.append(root)
root = root.left
这两步即不断弹入所有结点的左结点直至没有左结点
(3) root = root.right
这一步是提醒将一个结点弹出后要判断此结点有无右结点,若有继续压入右结点的左子结点,若没有直接跳出while root,重新从stack最顶端弹出一个新的结点开始新一轮迭代。