简单二叉树

来源:互联网 发布:淘宝流量钱包兑换 编辑:程序博客网 时间:2024/06/05 11:17

以下实现了二叉树的一些方法

#include <iostream>#include <string>#include <queue>#include <stack>using namespace std;class BiTreeNode{public:    char data;    int weight;    int high;    BiTreeNode* lchild;    BiTreeNode* rchild;    BiTreeNode() : lchild(NULL), rchild(NULL), weight(0), high(0){}    BiTreeNode(char  num) : data(num), lchild(NULL), rchild(NULL), weight(0), high(0){}};class BiTree{public:    BiTreeNode* Root;    queue<char> parent;    queue<char> child;    BiTree(){        leavenum = 0;    }    void CreateTree(string TreeArray){        pos = 0;        strTree.assign(TreeArray);        Root = CreateBiTree();    }    void CreateTree2(string TreeArray, int* w){        pos = 0;        index = 0;        weight = w;        strTree.assign(TreeArray);        Root = CreateBiTree2();    }    void PreOrder(BiTreeNode* T){        if(T){            cout<<T->data;            PreOrder(T->lchild);            PreOrder(T->rchild);        }    }    void PreOrder2(int i, int n, int num[]){        if(i < n && num[i] != 0){            cout<<num[i]<<" ";            PreOrder2(2*i+1, n, num);            PreOrder2(2*i+2, n, num);        }    }    void InOrder(BiTreeNode* T){        if(T){            InOrder(T->lchild);            cout<<T->data;            InOrder(T->rchild);        }    }    void PostOrder(BiTreeNode* T){        if(T){            PostOrder(T->lchild);            PostOrder(T->rchild);            cout<<T->data;        }    }    void leaveNum(BiTreeNode* T){        if(T->lchild = NULL && T->rchild == NULL){            leavenum++;        }        if(T->lchild){            leaveNum(T->lchild);        }        if(T->rchild){            leaveNum(T->rchild);        }    }    int TreeDepth(BiTreeNode* T){        if(!T) return 0;        int left = 1, right = 1;        left += TreeDepth(T->lchild);        right += TreeDepth(T->rchild);        return left > right ? left : right;    }    int height(BiTreeNode* T){        if(!T) return 0;        return max(height(T->lchild), height(T->rchild)) + 1;    }    void LevelOrder(BiTreeNode* T){        queue<BiTreeNode*> tq;        BiTreeNode* p = T;        if(p){            tq.push(p);        }        while(!tq.empty()){            p = tq.front();            cout<<p->data;            tq.pop();            if(p->lchild){                tq.push(p->lchild);            }            if(p->rchild){                tq.push(p->rchild);            }        }    }    void findNode(){        findNode(Root);        while(!child.empty()){            cout<<child.front()<<" ";            child.pop();        }        cout<<endl;        while(!parent.empty()){            cout<<parent.front()<<" ";            parent.pop();        }        cout<<endl;    }    void FindTimes(int value){        int r = 0;        cout<<findTimes(value, Root, r)<<endl;    }    void BuildTree(int n, int* num){        for(int i = 0; i < n; ++i){            insert(num[i], Root, false);        }    }    //二叉查找树之删除    void del(int value, BiTreeNode* &T){        if(T){            if(value == T->data){                if(T->lchild && T->rchild){                    BiTreeNode* p = T->rchild;                    while(p->lchild){                        p = p->lchild;                    }                    T->data = p->data;                    del(p->data, T->rchild);                }else{                    BiTreeNode* p = T;                    if(!T->lchild){                        T = T->rchild;                    }else if(!T->rchild){                        T = T->lchild;                    }                    delete p;                }            }else if(value < T->data){                del(value, T->lchild);            }else{                del(value, T->rchild);            }        }    }    //二叉树之带权路径和    void traverse(BiTreeNode* T){        if(T){            if(T->lchild){                T->lchild->high = T->high + 1;                traverse(T->lchild);            }            if(T->rchild){                T->rchild->high = T->high + 1;                traverse(T->rchild);            }        }    }    int findMaxPath(BiTreeNode* T){        if(!T) return 0;        return max(findMaxPath(T->lchild), findMaxPath(T->rchild)) + T->weight;    }    int WeightSum(BiTreeNode* T){        if(!T) return 0;        return WeightSum(T->lchild) + WeightSum(T->rchild) + T->weight*T->high;    }    //先序和中序遍历创建树    BiTreeNode* CreateBiTree(string pre, string mid){        BiTreeNode* T = new BiTreeNode();        T->data = pre[0];        int ltreelen = mid.find(pre[0]);        if(pre.length() == 1){            T->lchild = NULL;            T->rchild = NULL;        }else{            if(ltreelen > 0){                T->lchild = CreateBiTree(pre.substr(1, ltreelen), mid.substr(0, ltreelen));            }else{                T->lchild = NULL;            }            if(ltreelen < mid.length()-1){                T->rchild = CreateBiTree(pre.substr(ltreelen+1, pre.find('\0')), mid.substr(ltreelen+1, mid.find('\0')));            }else{                T->rchild = NULL;            }        }        Root = T;        return T;    }    //后序遍历非递归算法    void notRecursionOrder(){        BiTreeNode* T = Root;        stack<BiTreeNode*> s1;        stack<int> s2;        if(!T) return;        BiTreeNode* p = T;        do{            if(p){                s1.push(p);                s2.push(0);                p = p->lchild;            }else{                int tag = s2.top();                if(!tag){                    s2.pop();                    s2.push(1);                    p = s1.top()->rchild;                }else{                    p = s1.top();                    s1.pop();                    s2.pop();                    cout<<p->data;                    p = NULL;                }            }        }while(!s1.empty());        cout<<endl;    }private:    int pos, depth, index, leavenum;    int* weight;    string strTree;    BiTreeNode* CreateBiTree(){        BiTreeNode* T;        char ch;        ch = strTree[pos++];        if(ch == '0'){            T = NULL;        }else{            T = new BiTreeNode();            T->data = ch;            T->lchild = CreateBiTree();            T->rchild = CreateBiTree();        }        return T;    }    BiTreeNode* CreateBiTree2(){        BiTreeNode* T;        char ch;        ch = strTree[pos++];        if(ch == '0'){            T = NULL;        }else{            T = new BiTreeNode();            T->data = ch;            if(ch >= 'A' && ch <= 'Z'){                T->weight = weight[index++];            }            T->lchild = CreateBiTree2();            T->rchild = CreateBiTree2();        }        return T;    }    int findNode(BiTreeNode* T){        if(T->lchild == NULL && T->rchild == NULL){            return 0;        }        if(T->lchild && findNode(T->lchild) == 0){            child.push(T->lchild->data);            parent.push(T->data);        }        if(T->rchild && findNode(T->rchild) == 0){            child.push(T->rchild->data);            parent.push(T->data);        }        return 1;    }    int findTimes(int value, BiTreeNode* T, int& result){        if(!T){            result = -1;        }else{            ++result;            if(value < T->data){                findTimes(value, T->lchild, result);            }else if(value > T->data){                findTimes(value, T->rchild, result);            }else {                return result;            }        }    }    void insert(int value, BiTreeNode* &T, bool flag){        if(T){            if(value < T->data){                insert(value, T->lchild, flag);            }else{                insert(value, T->rchild, flag);            }        }else{            T = new BiTreeNode(value);            if(flag){                InOrder(Root);                cout<<endl;            }        }    }};struct HuffNode{    char elem;    int weight;    int parent;    int lchild;    int rchild;};class HuffMan{public:    int len;    int lnum;    HuffNode* huffTree;    string* huffCode;    void MakeTree(int n, int wt[]){        int i;        lnum = n;        len = 2*n -1;        huffTree = new HuffNode[2*n];        huffCode = new string[n+1];        for(i = 1; i <= n; ++i){            huffTree[i].weight = wt[i-1];        }        for(i = 1; i <= len; ++i){            if(i > n){                huffTree[i].weight = 0;            }            huffTree[i].parent = 0;            huffTree[i].lchild = 0;            huffTree[i].rchild = 0;        }        MakeTree();    }    void Coding(){        char* cd;        int i, j, c, f, start;        cd = new char[lnum + 1];        cd[lnum - 1] = '\0';        for(i = 1; i <= lnum; ++i){            start = lnum - 1;            for(c = i, f = huffTree[i].parent;  f != 0; c = f, f = huffTree[f].parent){                if(huffTree[f].lchild == c){                    cd[--start] = '0';                }else{                    cd[--start] = '1';                }            }huffCode[i].assign(&cd[start]);        }        delete []cd;    }    int Decode(const string codestr, char txtstr[]){        char ch;        int i, k = 0, c = len;        for(i = 0; i < codestr.length(); ++i){            ch = codestr[i];            if(ch == '0'){                c = huffTree[c].lchild;            }else if(ch == '1'){                c = huffTree[c].rchild;            }else{                return 0;            }            if(huffTree[c].lchild == 0 && huffTree[c].rchild == 0){                txtstr[k] = huffTree[c].elem;                ++k;                c = len;            }else{                ch = '\0';            }        }        if(ch == '\0') return 0;        else txtstr[k] = '\0';        return 1;    }    void Destroy(){        len = 0;        lnum = 0;        delete []huffTree;        delete []huffCode;    }private:    void MakeTree(){        int i, s1, s2;        for(i = lnum+1; i <= len; ++i){            SelectMin(i-1, &s1, &s2);            huffTree[s1].parent = i;            huffTree[s2].parent = i;            huffTree[i].lchild = s1;            huffTree[i].rchild = s2;            huffTree[i].weight = huffTree[s1].weight + huffTree[s2].weight;        }    }    void SelectMin(int pos, int* s1, int* s2){        int w1, w2, i;        w1 = w2 = 0x7fffffff;        *s1 = *s2 = 0;        for(i = 1; i <= pos; ++i){            if(huffTree[i].weight < w1 && huffTree[i].parent == 0){                w2 = w1;                *s2 = *s1;                w1 = huffTree[i].weight;                *s1 = i;            }else if(huffTree[i].weight < w2 && huffTree[i].parent == 0){                w2 = huffTree[i].weight;                *s2 = i;            }        }    }};//AVL树typedef struct AVLNode{    ElemType Element;    AVLTree Left;    AVLTree Right;    int Height;}AVLNode,*AVLTree,*Position;AVLTree MakeEmpty(AVLTree T){    if(T != NULL){        MakeEmpty(T->Left);        MakeEmpty(T->Right);        free(T);    }    return NULL;}Position Find(ElemType x,AVLTree T){    if(T == NULL)        return NULL;    if(x < T->Element)        return Find(x,T->Left);    else if(x > T->Element)        return Find(x,T->Right);    else        return T;}Position FindMin (AVLTree T){    if(T == NULL)        return NULL;    while(T->Left)        T = T->Left;    return  T;}Position FindMax(AVLTree T){    if (T == NULL)        return NULL;    while (T->Right)        T = T->Right;    return T;}static int Height(Position P){    if(P == NULL)        return -1;    return P->Height;}static int Max(int Lhs,int Rhs){    return Lhs > Rhs ? Lhs : Rhs;}static Position SingleRotateWithLeft(Position K2){    Position K1;    K1 = K2->Left;    K2->Left = K1->Right;    K1->Right = K2;    K2->Height = Max(Height(K2->Left),Height(K2->Right)) + 1;    K1->Height = Max(Height(K1->Left),Height(K1->Right)) + 1;    return K1;}static Position SingleRotateWithRight(Position K2){    Position K1;    K1 = K2->Right;    K2->Right = K1->Left;    K1->Left = K2;    K1->Height = Max(Height(K1->Left), Height(K1->Right)) + 1;    K2->Height = Max(Height(K2->Left), Height(K2->Right)) + 1;    return K1;}static Position DoubleRotateWithLeft(Position K3){    K3->Left = SingleRotateWithRight(K3->Left);    return SingleRotateWithLeft(K3);}static Position DoubleRotateWithRight(Position K3){    K3->Right = SingleRotateWithLeft(K3->Right);    return SingleRotateWithRight(K3);}AVLTree Insert(ElemType x,AVLTree T){    if(!T){        T = (AVLTree)malloc(sizeof(AVLNode));        if(!T)            exit(-1);        T->Element = x;        T->Height = 0;        T->Left = T->Right = NULL;    }    else if(x < T->Element){        T->Left = Insert(x,T->Left);        if(Height(T->Left) - Height(T->Right) == 2){            if(x < T->Left->Element)                T = SingleRotateWithLeft(T);            else                T = DoubleRotateWithLeft(T);        }    }    else if(x > T->Element){        T->Right = Insert(x,T->Right);        if(Height(T->Right) - Height(T->Left) == 2){            if(x < T->Right->Element)                T = SingleRotateWithRight(T);            else                T = DoubleRotateWithRight(T);        }    }    T->Height = Max(Height(T->Left),Height(T->Right)) + 1;    return T;}int main(){    int t;    cin>>t;    while(t--){        string str;        cin>>str;        BiTree bt;        bt.CreateTree(str);        //...    }    return 0;}


0 0
原创粉丝点击