1将该二元查找树转换成一个排序的双向链表

来源:互联网 发布:java事务的四个特性 编辑:程序博客网 时间:2024/06/06 05:10

#include <iostream>

using namespace std;

typedef struct node
{
    int value;
    node* left;
    node* right;
}node;

node* left_track(node* p)
{
    while(p->left != NULL)
        p = p -> left;
    return p;
}

node* right_track(node* p)
{
    while(p->right != NULL)
        p = p -> right;
    return p;
}

void track(node * p)
{
    node* left = p -> left;
    node* right = p -> right;
    if(right != NULL)
    {
        node* post = left_track(right); //post指向右子树的最左结点
        if(post != right)
        {
            p -> right = post;
            post -> left = p;
        }
        else
            post -> left = p;
    }
    if(left != NULL)
    {
        node* pre = right_track(left); //pre指向左子树的最右结点
        if(pre != left )
        {
            p -> left = pre;
            pre -> right = p;
        }
        else
            pre -> right = p;
    }
}


void travel(node* p) //必须采用后序遍历
{
    if(p == NULL)
        return;
    else
    {
        travel(p->left);
        travel(p->right);
        cout<<p->value<<endl;
        track(p);
    }
}

node* root = NULL;
void add_to_tree(int num)
{
    node* p = new node;
    p -> value = num;
    p -> left = NULL;
    p -> right = NULL;
    if(root == NULL)
        root = p;
    else
    {
        node* r = root;
        node* save = r;
        while(r != NULL)
        {
            save = r;
            if(num > r->value)
                r = r ->right;
            else
                r = r ->left;
        }
        if(num > save->value)
            save ->right = p;
        else
            save ->left =p;
    }
}

void middle_travel(node * root)
{

    if(root == NULL)
        return;
    else
    {
        middle_travel(root->left);
        cout<<root->value<<"\t";
        middle_travel(root->right);
    }
}

void delete_tree(node* root)  //必须使用后序遍历
{
    if(root == NULL)
        return;
    else
    {
        delete_tree(root->left);
        delete_tree(root->right);
        cout<< root->value <<" \t";
        delete root;
    }
}

int main()
{
    add_to_tree(8);
    add_to_tree(4);
    add_to_tree(12);
    add_to_tree(2);
    add_to_tree(6);
    add_to_tree(10);
    add_to_tree(14);
   // add_to_tree(11);
  //  add_to_tree(9);
    middle_travel(root);
    cout<<endl;

    travel(root);

    node* head = root;
    node* tail = root;
    while(head->left != NULL)
        head = head ->left;
    while(tail->right != NULL)
        tail = tail ->right;
    while(head != NULL)
    {
        cout << head ->value<<"\t";
        head = head -> right;
    }
    cout<<endl;
    while(tail != NULL)
    {
        cout<< tail -> value<<"\t";
        tail = tail ->left;
    }

    delete_tree(root);
    return 0;
}

原创粉丝点击