C++二叉排序樹的創建和插入

加/**/表示另一種二叉排序樹的創建方法

第一類

#include <iostream>
using namespace std;
class TreeNode {
public:
    int data;
    TreeNode *LeftChild;
    TreeNode *RightChild;
    TreeNode() :LeftChild(NULL), RightChild(NULL) {}
};
class BiSortTree {
private:
    TreeNode *root;
    int *info;
    int size;
    int loc;
    TreeNode *CreateTree();
    TreeNode* InsertNode(TreeNode *p, int d);
    TreeNode* Search(TreeNode *p, int d);
    void Delete(int d);

public:
    BiSortTree(int s, int arr[]);
    void CreateBiSortTree();
    void InsertBiSortTree(int d);
    void InOder(TreeNode *p);
    void InOderTree();
    void SearchData(int d);
    void DeleteData(int d);
};
BiSortTree::BiSortTree(int s, int arr[]) {
    /*
    loc = 1;
    */
    loc = 0;
    count = 0;
    size = s;
    info = new int[size];
    for (int i = 0; i < size; i++)
        info[i] = arr[i];
}
void BiSortTree::CreateBiSortTree() {
    /*
    root = new TreeNode();
    if (size)
        root->data = info[0];
    CreateTree(root);
    */
    CreateTree();
}
TreeNode *BiSortTree::CreateTree() {
    while (loc < size) 
        root = InsertNode(root, info[loc++]);
    /*
    if (loc < size) {
        if (p->data > info[loc]) {
            if (!p->LeftChild) {
                p->LeftChild = new TreeNode();
                p->LeftChild->data = info[loc++];
            }
            else
                CreateTree(p->LeftChild);
        }
        else
            if (p->data < info[loc]) {
                if (!p->RightChild) {
                    p->RightChild = new TreeNode();
                    p->RightChild->data = info[loc++];
                }
                else
                    CreateTree(p->RightChild);
            }
        CreateTree(root);
    }
    return NULL;
    */
    return NULL;
}
void BiSortTree::InOderTree() {
    InOder(root);
}
void BiSortTree::InOder(TreeNode *p) {
    if (p) {
        InOder(p->LeftChild);
        cout << p->data << ' ';
        InOder(p->RightChild);
    }
}
TreeNode* BiSortTree::InsertNode(TreeNode *p, int d) {
    TreeNode *T;
    if (!p) {
        T = new TreeNode();
        T->data = d; 
        return T;
    }
    if (p->data > d)
        p->LeftChild = InsertNode(p->LeftChild, d);
    else
        if (p->data < d)
            p->RightChild = InsertNode(p->RightChild, d);
    return p;
}
void BiSortTree::InsertBiSortTree(int d) {
    InsertNode(root, d);
}
int main() {
    int t;
    cin >> t;
    while (t--) {
        int s;
        cin >> s;
        int *arr = new int[s];
        for (int i = 0; i < s; i++)
            cin >> arr[i];
        BiSortTree sTree(s, arr);
        sTree.CreateBiSortTree();
        sTree.InOderTree();
        cout << endl;
        int m;
        cin >> m; //插入節點個數
        while (m--) {
            int d;
            cin >> d; //數據插入
            sTree.InsertBiSortTree(d);
            sTree.InOderTree();
            cout<<endl;
        }
        delete arr[];
    }
    //system("pause");
    return 0;
}

第二類

#include <iostream>
using namespace std;
class TreeNode {
public:
    int data;
    TreeNode *LeftChild;
    TreeNode *RightChild;
    TreeNode() :LeftChild(NULL), RightChild(NULL) {}
};
class BiSortTree {
private:
    TreeNode *root;
    int *info;
    int size;
    int loc;
    int count;
    TreeNode *CreateTree(TreeNode *p);
    TreeNode* InsertNode(TreeNode *p, int d);
    TreeNode* Search(TreeNode *p, int d);
    void Delete(int d);

public:
    BiSortTree(int s, int arr[]);
    void CreateBiSortTree();
    void InsertBiSortTree(int d);
    void InOder(TreeNode *p);
    void InOderTree();
    void SearchData(int d);
    void DeleteData(int d);
};
BiSortTree::BiSortTree(int s, int arr[]) {
    loc = 1;
    count = 0;
    size = s;
    info = new int[size];
    for (int i = 0; i < size; i++)
        info[i] = arr[i];
}
void BiSortTree::CreateBiSortTree() {
    root = new TreeNode();
    if (size)
        root->data = info[0];
    CreateTree(root);
}
TreeNode *BiSortTree::CreateTree(TreeNode *p) {
    if (loc < size) {
        if (p->data > info[loc]) {
            if (!p->LeftChild) {
                p->LeftChild = new TreeNode();
                p->LeftChild->data = info[loc++];
            }
            else
                CreateTree(p->LeftChild);
        }
        else
            if (p->data < info[loc]) {
                if (!p->RightChild) {
                    p->RightChild = new TreeNode();
                    p->RightChild->data = info[loc++];
                }
                else
                    CreateTree(p->RightChild);
            }
        CreateTree(root);
    }
    return NULL;
}
void BiSortTree::InOderTree() {
    InOder(root);
}
void BiSortTree::InOder(TreeNode *p) {
    if (p) {
        InOder(p->LeftChild);
        cout << p->data << ' ';
        InOder(p->RightChild);
    }
}
TreeNode* BiSortTree::InsertNode(TreeNode *p, int d) {
    TreeNode *T;
    if (!p) {
        T = new TreeNode();
        T->data = d; 
        return T;
    }
    if (p->data > d)
        p->LeftChild = InsertNode(p->LeftChild, d);
    else
        if (p->data < d)
            p->RightChild = InsertNode(p->RightChild, d);
    return p;
}
int main() {
    int t;
    cin >> t;
    while (t--) {
        int s;
        cin >> s;
        int *arr = new int[s];
        for (int i = 0; i < s; i++)
            cin >> arr[i];
        BiSortTree sTree(s, arr);
        sTree.CreateBiSortTree();
        sTree.InOderTree(); //中序遍歷輸出有序序列
        cout << endl;
        int m;
        cin >> m;
        while (m--) {
            int d;
            cin >> d;
            sTree.InsertBiSortTree(d);
            sTree.InOderTree();
            cout<<endl;
        }
    }
    system("pause");
}
/*Input
1
6
22 33 55 66 11 44
3
77
50
10
*/
/*OutPut
11 22 33 44 55 66 
11 22 33 44 55 66 77 
11 22 33 44 50 55 66 77 
10 11 22 33 44 50 55 66 77 
*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章