二叉树的基本操作

#include <iostream>

using namespace std;

typedef struct Tree
{
    char data1;
    struct Tree *lchild, *rchild;
}Tree;

template<typename T>
struct Node
{
    T data;
    Node<T>* next;
};

template<typename T>
class stack
{
    Node<T>* top;
public:
    stack() :top(NULL){}
    void push(T n);
    T pop();
    bool stackEmpty();
    T getTop();
    ~stack(){}
    void print();
};

template<typename T>
void stack<T>::push(T n)
{
    Node<T>* r = new Node<T>;
    r->data = n;
    r->next = top;
    top = r;
}

template<typename T>
T stack<T>::pop()
{
    Node<T> *ptr = top;
    top = top->next;
    T t = ptr->data;
    delete ptr;
    return t;
}


template<typename T>
void stack<T>::print()
{
    for (Node<T>* p = top; p; p = p->next)
        cout << p->data << "  ";
}

template<typename T>
T stack<T>::getTop()
{
    return top->data;
}

template<typename T>
bool stack<T>::stackEmpty()
{
    if (top)return false;
    else return true;
}
//////////////////////////////////////////////


void firstPutTree(Tree* &T)
{//用我自己的模板栈实现的  先序 遍历 
    stack<Tree*> s;
    Tree* p = T;
    Tree* q;
    for (; p || !s.stackEmpty();)
    {
        if (p)
        {
            s.push(p);
            p = p->lchild;
            cout << s.getTop()->data1;
        }
        else
        {
            q = s.pop();
            p = q->rchild;
        }
    }
}

void lastPutTree(Tree* &T)
{//用我自己的模板栈实现的  后序 遍历 
    stack<Tree*> s;
    Tree* p = T;
    Tree* q;
    for (; p || !s.stackEmpty();)
    {
        if (p)
        {
            s.push(p);
            p = p->lchild;

        }
        else
        {
            q = s.pop();
            if ((p = q->rchild) == NULL)
                cout << q->data1;
        }
    }
}

void midPutTree(Tree* &T)
{//用我自己的模板栈实现的  中序 遍历 
    stack<Tree*> s;
    Tree* p = T;
    Tree* q;
    for (; p || !s.stackEmpty();)
    {
        if (p)
        {
            s.push(p);
            p = p->lchild;

        }
        else
        {
            q = s.pop();
            cout << q->data1;
            p = q->rchild;
        }
    }
}
/*
void firstPutTree(Tree* T)
{
if(T)
{
firstPutTree(T->lchild);
cout<<T->data<<" ";
firstPutTree(T->rchild);
}
}*/

void firstCreateTree(Tree* &T)
{//先序创建 
    char ch;
    cin >> ch;
    if (ch == '#')T = NULL;
    else
    {
        T = new Tree;
        T->data1 = ch;
        firstCreateTree(T->lchild);
        firstCreateTree(T->rchild);
    }
}

void midCreateTree(Tree* &T)
{//中序创建 
    char ch;
    cin >> ch;
    if (ch == '#')T = NULL;
    else
    {
        T = new Tree;
        midCreateTree(T->lchild);
        T->data1 = ch;
        midCreateTree(T->rchild);
    }
}

void lastCreateTree(Tree* &T)
{//后序创建 
    char ch;
    cin >> ch;
    if (ch == '#')T = NULL;
    else
    {
        T = new Tree;
        lastCreateTree(T->lchild);
        lastCreateTree(T->rchild);
        T->data1 = ch;
    }
}

void copy(Tree* &T, Tree* &T2)
{//复制二叉树 
    if (T == NULL)
    {
        T2 = NULL;
        return;
    }
    else
    {
        T2 = new Tree;
        T2->data1 = T->data1;
        copy(T->lchild, T2->lchild);
        copy(T->rchild, T2->rchild);
    }
}

int deepth(Tree* &T)
{    
    int m, n;
    if (T == NULL)return 0;
    else
    {
        m = deepth(T->lchild);
        n = deepth(T->rchild);
        if (m > n)
            return m + 1;
        else return n + 1;
    }
}

int NodeCount(Tree* &T)
{
    if (T == NULL)
        return 0;
    else
        return NodeCount(T->lchild) + NodeCount(T->rchild) +1 ;
}
int main()
{
    Tree* T, *T2;
    cout << "1.先序创建" << endl;
    cout << "2.中序创建" << endl;
    cout << "3.后序创建" << endl;
    cout << "4.先序遍历" << endl;
    cout << "5.中序遍历" << endl;
    cout << "6.后序遍历" << endl;
    cout << "7.复制" << endl;
    cout << "8.深度" << endl;
    cout << "9.结点" << endl;
    int i;
    cin >> i;
    for (; i != 0;)
    {
        switch (i)
        {
        case 1:firstCreateTree(T); break;
        case 2:midCreateTree(T); break;
        case 3:lastCreateTree(T); break;
        case 4:firstPutTree(T); break;
        case 5:midPutTree(T2); break;
        case 6:lastPutTree(T); break;
        case 7:copy(T, T2); break;
        case 8:cout<<deepth(T); break;
        case 9:cout << NodeCount(T); break;
        }
        cout << endl << "which : ";
        cin >> i;
    }
}

 

posted on 2016-05-16 22:09  Kooing  阅读(147)  评论(0编辑  收藏  举报

导航