抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Problem: 94. 二叉树的中序遍历

思路

我们都知道中序遍历是左边 ——> 中间 ——> 右边

解题方法

  1. 一直向左边走
  2. 到达左边尽头后弹出并打印,然后向右边走一个。
  3. 继续一直向左边走。
  4. 到达左边尽头后弹出并打印,然后向右边走一个。
  5. 结束条件是 p 和栈 S 都为空。

复杂度

时间复杂度:

O(n)O(n)

空间复杂度:

O(n)O(n)

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/

typedef struct StackNode {
struct TreeNode **TreeNode;
struct StackNode *next;
} StackNode, *Stack;

void Push(Stack *S, struct TreeNode **tNode) {
StackNode *SN = (StackNode*)malloc(sizeof(StackNode));
SN->TreeNode = tNode;
if(!*S) {
SN->next = NULL;
(*S) = SN;
} else {
SN->next = *S;
*S = SN;
}
}

// 出栈
struct TreeNode **Pop(Stack *S) {
if(*S) {
struct TreeNode **p = (*S)->TreeNode;
StackNode *q = *S;
(*S) = (*S)->next;
free(q);
return p;
} else return NULL;
}

int* inorderTraversal(struct TreeNode* root, int* returnSize) {
Stack S = NULL;
struct TreeNode *p = root;
int *a = (int*)malloc(sizeof(int) * 100), *q = a;
if(root) Push(&S, &root);
while(p || S) {
if(p) {
if(p->left) Push(&S, &p->left);
p = p->left;
} else {
p = *Pop(&S);
*(q++) = p->val;
if(p->right) Push(&S, &p->right);
p = p->right;
}
}
*returnSize = q - a;
return a;
}