二叉树的各种操作

来源:互联网 发布:linux修改文件所有者 编辑:程序博客网 时间:2024/06/03 16:20


#include <iostream>

#include <stdio.h>

#include <stack>


using namespacestd;


#define ok 1

#define error 0

#define overflow -2


typedef char NodeDataType;

int cnt ;


int deep ;

typedef struct BiTNode{

    NodeDataType data;

    structBiTNode *lchild,*rchild;

}BiTNode,*BiTree;


void InitBiTree(BiTree &T)//树的初始化


{

    T = NULL;

}


void DestroyBiTree(BiTree &T)//销毁一个树


{

    if(T)

    {

    DestroyBiTree(T ->lchild);

    DestroyBiTree(T ->rchild);

    delete T;

    //T = NULL;

    }

}


void CreateBiTree(BiTree &T)//创建一个树


{

    char ch;

    scanf("%c",&ch);

    if(ch ==' ') T = NULL;

    else

    {

        T = newBiTNode;

        if(!T)

            exit(overflow);

        T -> data = ch;

        CreateBiTree(T ->lchild);

        CreateBiTree(T ->rchild);

    }

    return ;

}


void PreOrderTraverse(BiTree T)//先序访问


{

    if(T)

    {

        cout << T ->data << " ";

        PreOrderTraverse(T ->lchild);

        PreOrderTraverse(T ->rchild);

    }

    //return ;

}


void InOrderTraverse(BiTree T)//中序访问


{

    if(T)

    {

        InOrderTraverse(T ->lchild);

        cout << T ->data << " ";

        InOrderTraverse(T ->rchild);

    }

    //return ;

}


void PostOrderTraverse(BiTree T)//后序访问


{

    if(T)

    {

        PostOrderTraverse(T ->lchild);

        PostOrderTraverse(T ->rchild);

        cout << T ->data << " ";

    }

    //return ;

}


BiTree Findmode(BiTree T,NodeDataType x)// 找到值为 x的结点


{

    BiTree t;

    if(T ==NULL)

        t = NULL;

    elseif(T -> data == x)

        t =  T;

    else{

        t = Findmode(T ->lchild,x);

    if(t ==NULL)

        t = Findmode(T ->rchild,x);

    }

    return t;

}


void countleaf(BiTree T,int *cnt)//统计叶子结点的个数


{

    if(T)

    {

        if(T ->lchild == NULL && T ->rchild == NULL)

        {

            cout << T ->data << " ";

            (*cnt)++;

        }

        countleaf(T ->lchild,cnt);

        countleaf(T ->rchild,cnt);

    }

}


int BiTreeDepth(BiTree T)//返回树的深度


{

    int i =1,j = 1;

    if(T ==NULL)

        return0;

    i += BiTreeDepth(T ->lchild);

    j += BiTreeDepth(T ->rchild);

    return i > j ? i : j;

}


void BiTreeClear(BiTree &T)


{

    if(T)

    {

        T = NULL;

    }

}


bool BiTreeEmpty(BiTree T)


{

    if(T ==NULL)

        returntrue;

    else

        returnfalse;

}


void InOrder(BiTree T)//中序非递归算法1


{

    stack<BiTree> s;

    s.push(T);

    while(!s.empty())

    {

        BiTree p;

        while((p = s.top()) && p) s.push(p ->lchild); //向左走到尽头

        s.pop();  //空指针出栈

        if(!s.empty())

        {

            p = s.top();

            s.pop();

            cout << p ->data << " ";

            s.push(p ->rchild);

        }

    }

}


/*void InOrder(BiTree T) // 中序非递归算法2


{

    stack<BiTree> s;

    BiTree p = T;

    while(p || !s.empty())

    {

        if(p)    //根指针进栈,遍历左子树

        {

            s.push(p);

            p = p -> lchild;

        }

        else   //根指针退栈,访问根结点,遍历右子树

        {

            p = s.top();

            s.pop();

            if(!p)

                exit(overflow);

            cout << p -> data << " ";

            p = p -> rchild;

        }

    }

}*/



int main()


{

    BiTree T;

    InitBiTree(T);//初始化

    CreateBiTree(T); //创造一个树

    InOrder(T);cout << endl;

    cout <<" 先序:";PreOrderTraverse(T); cout <<endl; //先序遍历

    cout <<" 中序:";InOrderTraverse(T); cout <<endl; //中序遍历

    cout <<" 后序:";PostOrderTraverse(T); cout <<endl; //后序遍历

    BiTree t =Findmode(T,'B');//找到值为 B的结点

    if(t !=NULL//如果找到了

    {

        if(t ->lchild != NULL)// 如果有左孩子

            cout <<"左孩子:" << t ->lchild -> data <<endl;

        if(t ->rchild != NULL)// 如果有右孩子

            cout <<"右孩子:" << t ->rchild -> data <<endl;

    }

    int cnt =0;

    cout <<"叶子结点都有:" ;

    countleaf(T,&cnt);// 统计结点的个数

    cout <<"叶子结点的个数为:" << cnt <<endl;

    int depth =BiTreeDepth(T);

    cout <<"树的深度为:" << depth <<endl;

    cout <<BiTreeEmpty(T) << endl;

    BiTreeClear(T);

    cout <<BiTreeEmpty(T) << endl;

    return0;

}

0 0
原创粉丝点击