这块一直有点迷,梳理梳理。
1. 中序遍历
1.1 递归实现
每次递归,只需要判断节点是不是None,否则按照左中右的顺序打印出节点value值。
class Solution:
def inorderTraversal(self, root):
if not root:
return None
return self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)
1.2 非递归实现
对于树的遍历,非递归实现基本上要用到栈。
对于中序遍历的非递归实现,每次将当前节点(curr)的左子节点push到栈中,直到当前节点curr为None。这时pop出栈顶的第一个元素,设其为当前节点,并输出该节点的value值,且开始遍历该结点的右子树。
例如对于上图二叉树,其循环遍历过程如下表:
No. | 输出列表res | 栈stack | 当前结点curr |
---|---|---|---|
1 | [] | [] | 1 |
2 | .[] | [1] | 2 |
3 | [] | [1,2] | 4 |
4 | [] | [1,2,4] | None |
5 | .[4] | [1,2] | 4->None(4的右节点) |
6 | [4,2] | [1] | 2->5 |
7 | [4,2] | [1,5] | None(5的左节点) |
8 | .[4,2,5] | [1] | 5 ->None(5的右节点) |
9 | [4,2,5,1] | [] | 3 |
10 | [4,2,5,1] | [3] | None |
11 | [4,2,5,1,3] | [] | None |
规律为:当前节点curr不为None时,每一次循环将当前节点curr入栈;当前节点curr为None时,则出栈一个节点,且打印出当前节点的value。整个循环再curr皆为None时结束。
class Solution:
def inorderTraversal(self, root):
if not root: