Write a recursive function treeToList(Node root) that takes an ordered binary tree and rearranges the internal pointers to make a circular doubly linked list out of the tree nodes.
/********************************************************
**** The Great Tree List Recursion Problem ****
*******************************************************/
struct node;
typedef struct node *nodeptr;
struct node {
nodeptr left;
int data;
nodeptr right;
};
/*
* given two list nodes, join them together so the second
* immediately follows the first.
*/
void join(nodeptr a, nodeptr b)
{
a->right = b;
b->left = a;
}
/*
* given two circular doubly linked lists, append them
* and return the new list.
*/
nodeptr append(nodeptr a, nodeptr b)
{
nodeptr aLast, bLast;
if(a == NULL) return b;
if(b == NULL) return a;
aLast = a->left;
bLast = b->left;
join(aLast,b);
join(bLast,a);
return a;
}
/*
* Convert given BST to linked list
*/
nodeptr treeToList(nodeptr root)
{
nodeptr aList, bList;
if(root == NULL)
return NULL;
else {
aList = treeToList(root->left);
bList = treeToList(root->right);
root->left = root;
root->right = root;
aList = append(aList, root);
aList = append(aList, bList);
return aList;
}
}
/*
* print circular doubly linked list
*/
void printList(nodeptr head)
{
nodeptr temp = head;
if(head != NULL) {
while(head->right != temp) {
printf("%d ", head->data);
head = head->right;
}
printf("%d ", head->data);
}
printf("\n");
}
/********************************************************
**** The Great Tree List Recursion Problem ****
*******************************************************/
struct node;
typedef struct node *nodeptr;
struct node {
nodeptr left;
int data;
nodeptr right;
};
/*
* given two list nodes, join them together so the second
* immediately follows the first.
*/
void join(nodeptr a, nodeptr b)
{
a->right = b;
b->left = a;
}
/*
* given two circular doubly linked lists, append them
* and return the new list.
*/
nodeptr append(nodeptr a, nodeptr b)
{
nodeptr aLast, bLast;
if(a == NULL) return b;
if(b == NULL) return a;
aLast = a->left;
bLast = b->left;
join(aLast,b);
join(bLast,a);
return a;
}
/*
* Convert given BST to linked list
*/
nodeptr treeToList(nodeptr root)
{
nodeptr aList, bList;
if(root == NULL)
return NULL;
else {
aList = treeToList(root->left);
bList = treeToList(root->right);
root->left = root;
root->right = root;
aList = append(aList, root);
aList = append(aList, bList);
return aList;
}
}
/*
* print circular doubly linked list
*/
void printList(nodeptr head)
{
nodeptr temp = head;
if(head != NULL) {
while(head->right != temp) {
printf("%d ", head->data);
head = head->right;
}
printf("%d ", head->data);
}
printf("\n");
}
No comments:
Post a Comment