Skip to content

Commit 3ea076e

Browse files
committed
"Binary Tree Inorder Traversal"
1 parent b266507 commit 3ea076e

File tree

1 file changed

+101
-0
lines changed

1 file changed

+101
-0
lines changed

src/94.c

+101
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
4+
struct TreeNode {
5+
int val;
6+
struct TreeNode *left;
7+
struct TreeNode *right;
8+
};
9+
10+
struct StackNode {
11+
struct TreeNode *val;
12+
struct StackNode *next;
13+
};
14+
15+
struct Stack {
16+
struct StackNode *top_pt;
17+
int size;
18+
};
19+
20+
void push(struct Stack *stack, struct TreeNode *new_data) {
21+
if (stack) {
22+
struct StackNode *new_node
23+
= (struct StackNode *)calloc(1, sizeof(struct StackNode));
24+
new_node->val = new_data;
25+
new_node->next = stack->top_pt;
26+
27+
stack->top_pt = new_node;
28+
stack->size++;
29+
}
30+
}
31+
32+
struct TreeNode* top(struct Stack stack) {
33+
if (stack.top_pt) {
34+
return stack.top_pt->val;
35+
}
36+
else return NULL;
37+
}
38+
39+
void pop(struct Stack *stack) {
40+
if (stack && stack->top_pt) {
41+
struct StackNode *top = stack->top_pt;
42+
stack->top_pt = top->next;
43+
stack->size--;
44+
free(top);
45+
}
46+
}
47+
48+
int *inorderTraversal(struct TreeNode *root, int *returnSize) {
49+
*returnSize = 0;
50+
if (root == NULL) return NULL;
51+
52+
struct Stack stack;
53+
stack.top_pt = NULL;
54+
stack.size = 0;
55+
56+
int *ret = (int *)calloc(1024, sizeof(int));
57+
struct TreeNode *p = root;
58+
while (stack.size || p) {
59+
if (p) {
60+
push(&stack, p);
61+
p = p->left;
62+
}
63+
else {
64+
p = top(stack);
65+
pop(&stack);
66+
ret[(*returnSize)++] = p->val;
67+
p = p->right;
68+
}
69+
}
70+
return ret;
71+
}
72+
73+
int main() {
74+
struct TreeNode *t = (struct TreeNode *)calloc(5, sizeof(struct TreeNode));
75+
struct TreeNode *p = t;
76+
p->val = 4;
77+
78+
p->left = ++t;
79+
t->val = 2;
80+
p->left->left = ++t;
81+
t->val = 1;
82+
t->left = t->right = NULL;
83+
p->left->right = ++t;
84+
t->val = 3;
85+
t->left = t->right = NULL;
86+
87+
p->right = ++t;
88+
t->val = 5;
89+
t->left = t->right = NULL;
90+
91+
int size = 0;
92+
int *ret = inorderTraversal(p, &size);
93+
int i;
94+
/* should be 12345 */
95+
for (i = 0; i < size; i++) {
96+
printf("%d", ret[i]);
97+
}
98+
printf("\n");
99+
100+
return 0;
101+
}

0 commit comments

Comments
 (0)