【資料結構】回顧二叉樹

nomasp發表於2015-05-09

1.為什麼會有樹?因為當有大量的輸入資料時,連結串列的線性訪問時間就顯得略長了。而樹結構,其大部分操作的執行時間平均為O(logN)。

2.樹的實現並不難,幾行程式碼就搞定了。

struct TreeNode
{
    Object element;
    TreeNode *firstChild;
    TreeNode *nextSibling;
}

3.遍歷形式:

// 中序遍歷二叉樹
void inorder(tree_pointer ptr)
{
    if(ptr)
    {
        inorder(ptr->left_child);
        printf("%d",ptr->data);
        inorder(ptr->right_child);
    }
}

// 前序遍歷二叉樹
void preorder(tree_pointer ptr)
{
    if(ptr)
    {
        printf("%d",ptr->data);
        preorder(ptr->left_child);
        preorder(ptr->right_child);
    }
}

// 後序遍歷二叉樹
void postorder(tree_pointer ptr)
{
    if(ptr)
    {
        postorder(ptr->left_child);
        postorder(ptr->right_child);
        printf("%d",ptr->data);
    }
}

4.迭代的中序遍歷

void iter_inorder(tree_pointer node)
{
    int top=-1;
    tree_pointer stack[MAX_STACK_SIZE];
    for(;;)
    {
        for(;node;node=node->left_child)
            add(&top,node);
        node=delete(&top);
        if(!node)
            break;
        printf("%d",node->data);
        node=node->right_child;
    }
}

5.二叉樹的層序遍歷

void level_order(tree_pointer ptr)
{
    int front=rear=0;
    tree_pointer queue[MAX_QUEUE_SIZE];
    if(!ptr)
        return;
    addq(front,&rear,ptr);
    for(;;)
    {
        ptr=deleteq(&front,rear);
        if(ptr)
        {
            printf("%d",ptr->data);
            if(ptr->left_child)
                addq(front,&rear,ptr->left_child);
            if(ptr->right_child)
                addq(front,&rear,ptr->right_child);
        }
        else
            break;
    }
}

6.二叉樹的複製

tree_pointer copy(tree_pointer original)
{
    tree_pointer temp;
    if(original)
    {
        temp=(tree_pointer) malloc(sizeof(node));
        if(IS_FULL(temp))
        {
            fprintf(stderr,"The memory is full\n");
            exit(1);
        }
        temp->left_child=copy(original->left_child);
        tmep->right_child=copy(original->right_child);
        temp->data=original->data;
        return temp;
    }
    return NULL;
}

7.判斷二叉樹的等價性

int equal(tree_pointer first,tree_pointer second)
{
    return ((!first&&!second)||(first && second && (first->data == second->data) && 
            equal(first->left_child,second->left_child) &&
            equal(first->right_child,second->right_child));
}

8.尋找結點的中序後繼

threaded_pointer insucc(threaded_pointer tree)
{
    threaded_pointer temp;
    temp=tree->right_child;
    if(!tree->right_thread)
        while(!temp->left_thread)
            temp=temp->left_child;
    return temp;
}

9.線索二叉樹的中序遍歷

void tinorder(threaded_pointer tree)
{
    threaded_pointer temp=tree;
    for(;;)
    {
        temp=insucc(temp);
        if(temp==tree)
            break;
        printf("%3c",temp->data);
    }
}

10.線索二叉樹的右插入操作

void insert_right(threaded_pointer parent,threaded_pointer child)
{
     threaded_pointer temp;
     child->right_child=parent->right_child;
     child->right_thread=parent->right_thread;
     child->left_child=parent;
     child->left_thread=TRUE;
     parent->right_child=child;
     parent->right_thread=FALSE;
     if(!child->right_thread)
     {
         temp=insucc(child);
         temp->left_child=child;
     }
}



感謝您的訪問,希望對您有所幫助。

歡迎大家關注或收藏、評論或點贊。


為使本文得到斧正和提問,轉載請註明出處:
http://blog.csdn.net/nomasp


相關文章