Catalogue
Question
Given a binary tree, return the inorder traversal of its nodes’ values.
Example:
Input: [1,null,2,3] 1 \ 2 / 3 Output: [1,3,2]
Follow up: Recursive solution is trivial, could you do it iteratively?
Analysis
中值遍历是深度优先(Deep-first search)的一种树遍历方式,它先遍历节点左树(左节点),再输出节点自身,然后遍历右树(右节点)。流程如下图所示:

图片来自维基百科
这个问题可以采用递归或循环完成:
递归
给递归函数传入一个节点,递归函数再调用自身并传入左子节点,遍历节点左侧;再输出节点自身的值;最后调用自身并传入右子节点,遍历右侧。当前节点为空时,不做处理。循环
循环中需要额外的栈用来储存当前节点下的左节点,当左节点遍历到底时,输出当前左子节点A的值,并将当前节点赋值为其右子节点B。如果右子节点B非空,则从右子节点B开始向下遍历其左子节点C;如果右子节点B为空,则pop
出stack
下一个值(即A的父节点)进行输出,然后继续上述循环。这里解释可能不清晰,所以采用字母区别节点,希望代码能够表达清楚思路。Morris Traversal
无论是递归还是循环,他们的时间复杂度都是O(n),空间复杂度都是O(logn),Morris Traversal 让部分右子节点指回某一级的节点,从而在循环中完成从子节点回到父节点的操作,而不使用额外的栈来储存节点。具体的原理解释不太易懂,这里用图示解释:
Code
1 | # Definition for a binary tree node. |