-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpostorder.c
143 lines (133 loc) · 2.75 KB
/
postorder.c
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// postOrder traversal
#include <stdlib.h>
#include <stdio.h>
#define max 10
struct node
{
int data;
struct node *left;
struct node *right;
};
struct stack
{
int size;
int top;
struct node **arr;
};
struct node *createNode(int data)
{
struct node *root = malloc(sizeof(struct node));
if (!root)
{
return NULL;
}
root->data = data;
root->left = NULL;
root->right = NULL;
return root;
}
struct stack *createStack()
{
struct stack *s = malloc(sizeof(struct stack));
if (!s)
{
return NULL;
}
s->size = max;
s->top = -1;
s->arr = malloc(max * sizeof(struct node *));
if (!s->arr)
{
return NULL;
}
return s;
}
int isEmpty(struct stack *s)
{
return (s->top == -1);
}
int isFull(struct stack *s)
{
return (s->top == s->size - 1);
}
void push(struct stack *s, struct node *root)
{
if (isFull(s))
{
printf("Stack overflow\n");
return;
}
s->top++;
s->arr[s->top] = root;
}
void pop(struct stack *s)
{
if (isEmpty(s))
{
printf("Stack underflow\n");
return;
}
struct node *tree = s->arr[s->top];
s->top--;
// return tree;
}
struct node *top(struct stack *s)
{
if (isEmpty(s))
{
printf("Stack underflow\n");
return NULL;
}
struct node *tree = s->arr[s->top];
// s->top--;
return tree;
}
void postOrder(struct node *root)
{
struct node *previous = NULL;
struct stack *s = createStack();
do
{
while (root != NULL)
{
push(s, root);
root = root->left;
}
while (root == NULL && !isEmpty(s))
{
root = top(s);
if (root->right == NULL || root->right == previous)
{
printf("%d ", root->data);
pop(s);
previous = root;
root = NULL;
}
else
{
root = root->right;
}
}
} while (!isEmpty(s));
printf("\n");
}
int main()
{
// struct node *root = (struct node *)malloc(sizeof(struct node));
struct node *root = createNode(23); /* 23 */
struct node *r1 = createNode(20); /* /\ */
struct node *r2 = createNode(25); /* 20 25 */
struct node *r3 = createNode(18); /* /\ /\ */
struct node *r4 = createNode(21); /* 18 21 24 26 */
struct node *r5 = createNode(24);
struct node *r6 = createNode(26);
root->left = r1;
root->right = r2;
r1->left = r3;
r1->right = r4;
r2->left = r5;
r2->right = r6;
printf("The preorder traversal of the given tree is:\n");
postOrder(root);
return 0;
}