+ Reply to Thread
Results 1 to 2 of 2

Thread: Tree to List

  1. #1
    Krazy Guest

    Tree to List

    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.

  2. #2
    Krazy Guest
    Code:
    #include <stdio.h>
    #include <stddef.h>
    #include <stdlib.h>
    
    /* The node type from which both the tree and list are built */
    struct node {
        int data;
        struct node* small;
        struct node* large;
    };
    typedef struct node* Node;
    
    /*
     helper function -- given two list nodes, join them
     together so the second immediately follow the first.
     Sets the .next of the first and the .previous of the second.
    */
    static void join(Node a, Node b) {
        a->large = b;
        b->small = a;
    }
    
    /*
     helper function -- given two circular doubly linked
     lists, append them and return the new list.
    */
    static Node append(Node a, Node b) {
        Node aLast, bLast;
        
        if (a==NULL) return(b);
        if (b==NULL) return(a);
        
        aLast = a->small;
        bLast = b->small;
        
        join(aLast, b);
        join(bLast, a);
        
        return(a);
    }
    
    /*
     --Recursion--
     Given an ordered binary tree, recursively change it into
     a circular doubly linked list which is returned.
    */
    static Node treeToList(Node root) {
        Node aList, bList;
        
        if (root==NULL) return(NULL);
    
        /* recursively solve subtrees -- leap of faith! */
        aList = treeToList(root->small);
        bList = treeToList(root->large);
        
        /* Make a length-1 list ouf of the root */
        root->small = root;
        root->large = root;
    
        /* Append everything together in sorted order */
        aList = append(aList, root);
        aList = append(aList, bList);
        
        return(aList);
    }
    
    /* Create a new node */
    static Node newNode(int data) {
        Node node = (Node) malloc(sizeof(struct node));
        node->data = data;
        node->small = NULL;
        node->large = NULL;
        return(node);
    }
    
    /* Add a new node into a tree */
    static void treeInsert(Node* rootRef, int data) {
        Node root = *rootRef;
        if (root == NULL) *rootRef = newNode(data);
        else {
            if (data <= root->data) treeInsert(&(root->small), data);
            else treeInsert(&(root->large), data);
        }
    }
    
    static void printList(Node head) {
        Node current = head;
        
        while(current != NULL) {
            printf("%d ", current->data);
            current = current->large;
            if (current == head) break;
        }
        printf("\n");
    }
    
    /* Demo that the code works */
    int main() {
        Node root = NULL;
        Node head;
        
        treeInsert(&root, 4);
        treeInsert(&root, 2);
        treeInsert(&root, 1);
        treeInsert(&root, 3);
        treeInsert(&root, 5);
        
        head = treeToList(root);
        
        printList(head);    /* prints: 1 2 3 4 5  */
        
        return(0);
    }
    Last edited by Krazy; 17th November 2010 at 10:56.

+ Reply to Thread

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. Linked list to Binary Search Tree
    By Surfer in forum Microsoft
    Replies: 0
    Last Post: 19th July 2010, 23:35
  2. Tree to Doubly linked list
    By Surfer in forum Algorithm/Data Structure Questions
    Replies: 1
    Last Post: 21st June 2010, 13:50

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts