07.C语言二叉树的基本操作

二叉树的创建,先后序递归,非递归遍历,查找叶子结点。

#include <iostream>

using namespace std;

#define OK 1
#define ERROR 0

typedef int Status;
typedef char TElemType;
#define MAXSIZE 100

typedef struct BiTNode{
    //结点数据域
    TElemType data;
    //左右孩子结点
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;


//先序创建一个二叉树
void CreatTree(BiTree &T){
    char ch;
    cin>>ch;
    if (ch == '#'){
        T=NULL;
    } else{
        T = new BiTNode;
        T->data = ch;
        CreatTree(T->lchild);
        CreatTree(T->rchild);
    }
}

//中序遍历非递归
void InOrderTraverse(BiTree T){
    BiTree q;
    struct BiTNode *st[MAXSIZE];
    int top = 0;
    BiTree p = T;
    q = new BiTNode;
    while (p || top){
     if (p){
         st[top++] = p;
         p = p->lchild;
     }else{
         q =  st[--top];
         cout<<q->data<<endl;
         p = q->rchild;
     }
    }
}

//先序遍历非递归
void PreOrderTraverse(BiTree T){
    BiTree q;
    //栈的初始化
    struct BiTNode *st[MAXSIZE];
    //定义栈顶
    int top = 0;
    BiTree p = T;
    q = new BiTNode;
    while (p || top){
        if (p){
            st[top++] = p;
            cout<<p->data<<endl;
            p = p->lchild;
        }else{
            q =  st[--top];
            p = q->rchild;
        }
    }
}

//先序遍历递归
void PreOrderTraverse2(BiTree T){
    if (T != NULL){
        cout<<T->data<<endl;
        PreOrderTraverse2(T->lchild);
        PreOrderTraverse2(T->rchild);
    }
}

//查找叶子数节点个数
Status pre_node(BiTree T,Status node)  //求叶节点
{
    if (T!=NULL) {
        if (T->lchild == NULL && T->rchild == NULL) {
            node++;
        }
        node = pre_node(T->lchild,node);
        node = pre_node(T->rchild,node);
    }
    return node;
}

//输出函数
void OutPrint(){
   BiTree T;
   int choose = 0;
   cout<<"1、先序创建一个二叉树"<<endl;
   cout<<"2、中序遍历非递归"<<endl;
   cout<<"3、先序遍历非递归"<<endl;
   cout<<"4、先序遍历递归"<<endl;
   cout<<"5、查找叶子节点个数"<<endl;
   cout<<"0、退出系统"<<endl;
   while (1){
       cout<<"请输入要选择的功能前的序号:"<<endl;
       cin>>choose;
       if (choose == 0){
           cout<<"系统退出成功"<<endl;
           break;
       }
       switch (choose) {
           case 1 :{
               cout<<"请输入二叉树:"<<endl;
               CreatTree(T);
               break;
           }
           case 2 :{
               cout<<"中序遍历非递归结果为:"<<endl;
               InOrderTraverse(T);
               break;
           }
           case 3 :{
               cout<<"先序遍历非递归结果为:"<<endl;
               PreOrderTraverse(T);
               break;
           }
           case 4 :{
               cout<<"先序遍历递归结果为:"<<endl;
               PreOrderTraverse2(T);
               break;
           }
           case 5 : {
               int node = 0;
               node = pre_node(T,node);
               cout<<"叶子结点的个数为:";
               cout<<node<<endl;
               break;
           }
       }
   }
}

    int main() {
        OutPrint();
       return 0;
    }
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值