二叉树的各种操作


#include <iostream>

#include <stdio.h>

#include <stack>


using namespace std;


#define ok 1

#define error 0

#define overflow -2


typedef char NodeDataType;

int cnt ;


int deep ;

typedef struct BiTNode{

    NodeDataType data;

    struct BiTNode *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 = new BiTNode;

        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;

    else if(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)

        return 0;

    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)

        return true;

    else

        return false;

}


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;

    return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值