C++二叉排序树之查找结点

来源:互联网 发布:centos nat 上网 编辑:程序博客网 时间:2024/04/25 15:32
#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 *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;    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);    }}void BiSortTree::SearchData(int d) {    TreeNode *t = Search(root, d);    if (t)        cout << t->data;    else        cout << "NOT FOUND";}TreeNode* BiSortTree::Search(TreeNode *p, int d) {    if (p) {        if (p->data == d)            return p;        if (p->data > d)            return Search(p->LeftChild, d);        else            return Search(p->RightChild, d);    }    return NULL;}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.SearchData(d);            cout<<endl;        }    }    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);    int 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);    }}void BiSortTree::SearchData(int d) {    count = 0;    cout << Search(root, d);}int BiSortTree::Search(TreeNode *p, int d) {    if (!p) {        count = -1;        return count;    }    if (p->data == d)        return ++count;    if (p->data > d)        Search(p->LeftChild, d);    else        Search(p->RightChild, d);    if (count > 0)        return ++count;    return count;}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.SearchData(d);            cout<<endl;        }    }    //system("pause");    return 0;}/*InPut1622 33 55 66 11 44711223344556677*//*OutPut 查找次数11 22 33 44 55 66 212434-1*/
0 0