File tree Expand file tree Collapse file tree 8 files changed +261
-0
lines changed
109_convert_sorted_list_to_binary_search_tree
114_flatten_binary_tree_to_linked_list Expand file tree Collapse file tree 8 files changed +261
-0
lines changed Original file line number Diff line number Diff line change 1+ all :
2+ gcc -O2 -o test bst_convert.c
Original file line number Diff line number Diff line change 1+ #include <stdio.h>
2+ #include <stdlib.h>
3+
4+ struct ListNode {
5+ int val ;
6+ struct ListNode * next ;
7+ };
8+
9+ struct TreeNode {
10+ int val ;
11+ struct TreeNode * left ;
12+ struct TreeNode * right ;
13+ };
14+
15+ static struct TreeNode * recursive (int * nums , int lo , int hi )
16+ {
17+ int mid = lo + (hi - lo ) / 2 ;
18+ struct TreeNode * node = malloc (sizeof (* node ));
19+ node -> val = nums [mid ];
20+ node -> left = mid > lo ? recursive (nums , lo , mid - 1 ) : NULL ;
21+ node -> right = mid < hi ? recursive (nums , mid + 1 , hi ) : NULL ;
22+ return node ;
23+ }
24+
25+ static struct TreeNode * sortedListToBST (struct ListNode * head )
26+ {
27+ int i , nums [10000 ];
28+ for (i = 0 ; head != NULL ; head = head -> next , i ++ ) {
29+ nums [i ] = head -> val ;
30+ }
31+ if (i == 0 ) {
32+ return NULL ;
33+ }
34+ return recursive (nums , 0 , i - 1 );
35+ }
36+
37+ int main (int argc , char * * argv )
38+ {
39+ sortedListToBST (NULL );
40+ return 0 ;
41+ }
Original file line number Diff line number Diff line change 1+ all :
2+ gcc -O2 -o test flatten.c
Original file line number Diff line number Diff line change 1+ #include <stdio.h>
2+ #include <stdlib.h>
3+ #include <string.h>
4+
5+ struct TreeNode {
6+ int val ;
7+ struct TreeNode * left ;
8+ struct TreeNode * right ;
9+ };
10+
11+ static struct TreeNode * recursive (struct TreeNode * node )
12+ {
13+ if (node == NULL ) {
14+ return NULL ;
15+ }
16+
17+ if (node -> right == NULL && node -> left == NULL ) {
18+ return node ;
19+ }
20+
21+ struct TreeNode * right_last = recursive (node -> right );
22+ struct TreeNode * left_last = recursive (node -> left );
23+
24+ if (left_last != NULL ) {
25+ left_last -> right = node -> right ;
26+ node -> right = node -> left ;
27+ node -> left = NULL ;
28+ }
29+
30+ return right_last != NULL ? right_last : left_last ;
31+ }
32+
33+ static void flatten (struct TreeNode * root )
34+ {
35+ recursive (root );
36+ }
37+
38+ int main (void )
39+ {
40+ struct TreeNode root , n1 [2 ], n2 [4 ], n3 [8 ];
41+ root .val = 5 ;
42+ n1 [0 ].val = 4 ;
43+ n1 [1 ].val = 8 ;
44+ n2 [0 ].val = 11 ;
45+ n2 [2 ].val = 13 ;
46+ n2 [3 ].val = 4 ;
47+ n3 [0 ].val = 7 ;
48+ n3 [1 ].val = 2 ;
49+ n3 [6 ].val = 5 ;
50+ n3 [7 ].val = 1 ;
51+
52+ root .left = & n1 [0 ];
53+ root .right = & n1 [1 ];
54+ n1 [0 ].left = & n2 [0 ];
55+ n1 [0 ].right = NULL ;
56+ n1 [1 ].left = & n2 [2 ];
57+ n1 [1 ].right = & n2 [3 ];
58+ n2 [0 ].left = & n3 [0 ];
59+ n2 [0 ].right = & n3 [1 ];
60+ n2 [2 ].left = NULL ;
61+ n2 [2 ].right = NULL ;
62+ n2 [3 ].left = & n3 [6 ];
63+ n2 [3 ].right = & n3 [7 ];
64+ n3 [0 ].left = NULL ;
65+ n3 [0 ].right = NULL ;
66+ n3 [1 ].left = NULL ;
67+ n3 [1 ].right = NULL ;
68+ n3 [6 ].left = NULL ;
69+ n3 [6 ].right = NULL ;
70+ n3 [7 ].left = NULL ;
71+ n3 [7 ].right = NULL ;
72+
73+ flatten (& root );
74+
75+ struct TreeNode * p ;
76+ for (p = & root ; p != NULL ; p = p -> right ) {
77+ printf ("%d " , p -> val );
78+ }
79+ printf ("\n" );
80+ return 0 ;
81+ }
Original file line number Diff line number Diff line change 1+ all :
2+ gcc -O2 -o test reorder_list.c
Original file line number Diff line number Diff line change 1+ #include <stdio.h>
2+ #include <stdlib.h>
3+
4+ struct ListNode {
5+ int val ;
6+ struct ListNode * next ;
7+ };
8+
9+ static void reverse (struct ListNode * dummy )
10+ {
11+ struct ListNode * prev = dummy -> next ;
12+ if (prev != NULL ) {
13+ struct ListNode * p = prev -> next ;
14+ while (p != NULL ) {
15+ prev -> next = p -> next ;
16+ p -> next = dummy -> next ;
17+ dummy -> next = p ;
18+ p = prev -> next ;
19+ }
20+ }
21+ }
22+
23+ static void reorderList (struct ListNode * head )
24+ {
25+ if (head == NULL ) {
26+ return ;
27+ }
28+
29+ int count = 0 ;
30+ struct ListNode * p = head ;
31+ struct ListNode * q = p ;
32+ for (; p != NULL ; p = p -> next ) {
33+ if ((++ count & 0x1 ) == 0 ) {
34+ q = q -> next ;
35+ }
36+ }
37+
38+ reverse (q );
39+
40+ struct ListNode * r ;
41+ for (p = head , r = q -> next ; r != NULL ; p = r -> next , r = q -> next ) {
42+ q -> next = r -> next ;
43+ r -> next = p -> next ;
44+ p -> next = r ;
45+ }
46+ }
47+
48+ int main (int argc , char * * argv )
49+ {
50+ int i , count = argc - 1 ;
51+ struct ListNode * head = NULL , * p , * prev ;
52+ for (i = 0 ; i < count ; i ++ ) {
53+ p = malloc (sizeof (* p ));
54+ p -> val = atoi (argv [i + 1 ]);
55+ p -> next = NULL ;
56+ if (head == NULL ) {
57+ head = p ;
58+ } else {
59+ prev -> next = p ;
60+ }
61+ prev = p ;
62+ }
63+
64+ reorderList (head );
65+ for (p = head ; p != NULL ; p = p -> next ) {
66+ printf ("%d " , p -> val );
67+ }
68+ printf ("\n" );
69+ return 0 ;
70+ }
Original file line number Diff line number Diff line change 1+ all :
2+ gcc -O2 -o test insert_sort_list.c
Original file line number Diff line number Diff line change 1+ #include <stdio.h>
2+ #include <stdlib.h>
3+
4+ struct ListNode {
5+ int val ;
6+ struct ListNode * next ;
7+ };
8+
9+ static struct ListNode * insertionSortList (struct ListNode * head )
10+ {
11+ if (head == NULL ) {
12+ return NULL ;
13+ }
14+
15+ if (head -> next == NULL ) {
16+ return head ;
17+ }
18+
19+ struct ListNode dummy ;
20+ struct ListNode * p0 , * p , * p1 ;
21+ dummy .next = head ;
22+
23+ for (p0 = head , p = head -> next ; p != NULL ; p0 = p , p = p -> next ) {
24+ if (p -> val < p0 -> val ) {
25+ p0 -> next = p -> next ;
26+ for (p1 = & dummy ; p1 != p0 ; p1 = p1 -> next ) {
27+ if (p1 -> next -> val >= p -> val ) {
28+ p -> next = p1 -> next ;
29+ p1 -> next = p ;
30+ break ;
31+ }
32+ }
33+ p = p0 ;
34+ }
35+ }
36+
37+ return dummy .next ;
38+ }
39+
40+ int main (int argc , char * * argv )
41+ {
42+ int i , count = argc - 1 ;
43+ struct ListNode * head = NULL , * p , * prev ;
44+ for (i = 0 ; i < count ; i ++ ) {
45+ p = malloc (sizeof (* p ));
46+ p -> val = atoi (argv [i + 1 ]);
47+ p -> next = NULL ;
48+ if (head == NULL ) {
49+ head = p ;
50+ } else {
51+ prev -> next = p ;
52+ }
53+ prev = p ;
54+ }
55+
56+ for (p = insertionSortList (head ); p != NULL ; p = p -> next ) {
57+ printf ("%d " , p -> val );
58+ }
59+ printf ("\n" );
60+ return 0 ;
61+ }
You can’t perform that action at this time.
0 commit comments