二叉树的创建及相应操作

8 篇文章 0 订阅
本文介绍如何使用链表实现二叉树,包括创建二叉树、计算总结点数以及递归和非递归方式的先序、中序、后序遍历。此外,还涵盖了求解树高、特定节点路径、叶子节点数量等操作。
摘要由CSDN通过智能技术生成

下面是用链表做的一个二叉树,包含了二叉树的创建、先序遍历,中序遍历,后序遍历的递归操作和非递归操作,还有求二叉树的的高度,根节点到某一节点的路径,叶子结点个数和总节点个数。

万年的头文件

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define MAX_TREE_SIZE 100
using namespace std;

二叉树的链式存储结构:

   typedef char TElemType;
    typedef struct BiTNode {
        TElemType data;
        struct BiTNode *lchild,*rchlid;//左子女和又子女
    }BiTNode,*BiTree;

创建二叉树,并求二叉树总结点数

 int CreateBiTree(BiTree &BT,int &count_Node){//创建二叉树
        char ch;
        cout<<"请输入当前节点值:";
        cin>>ch;
        if (ch=='#')//#表示空
            BT=NULL;
        else{
            if(!(BT=(BiTree)malloc(sizeof(BiTNode))))   exit (-1);//如果没有成功的申请到内存空间则结束程序
            BT->data=ch;
            count_Node++;
            CreateBiTree(BT->lchild,count_Node);
            CreateBiTree(BT->rchlid,count_Node);
        }
        return 1;
    }

先序遍历二叉树的递归操作:

void PreOrder (BiTree BT) {//递归先序遍历二叉树
    if (BT != NULL){
        cout<<BT->data<<' '<<endl;
        PreOrder(BT->lchild);
        PreOrder(BT->rchlid);
    }
}

中序遍历二叉树的递归操作

void InOrder (BiTree BT) {//递归中序遍历二叉树
    if (BT != NULL){
        InOrder(BT->lchild);
        cout<<BT->data<<' '<<endl;
        InOrder(BT->rchlid);
    }
}

后序遍历二叉树的递归操作:

void PostOrder (BiTree BT) {//递归后序遍历二叉树
    if (BT != NULL){
        PostOrder(BT->lchild);
        PostOrder(BT->rchlid);
        cout<<BT->data<<' '<<endl;
    }
}

先序遍历二叉树的非递归操作:

  void NRPerOrder(BiTree BT){//非递归先序遍历二叉树
        BiTree stack[MAX_TREE_SIZE],p;
        int top;
        if (BT!=NULL){
            top=1;
            stack[top]=BT;
            while(top>0){
                p=stack[top];
                top--;
                cout<<p->data<<' '<<endl;
                if (p->rchlid!=NULL){
                    top++;
                    stack[top]=p->rchlid;
                }
                if (p->lchild!=NULL){
                    top++;
                    stack[top]=p->lchild;
                }
            }
        }
    }

中序遍历二叉树的非递归操作:

void NRInOrder(BiTree BT){//非递归中序遍历二叉树
    BiTree stack[MAX_TREE_SIZE],p;
    int top=0;
    p=BT;
    do{
        while(p!=NULL){
            top++;
            stack[top]=p;
            p=p->lchild;
        }
        if (top>0){
            p=stack[top];
            top--;
            cout<<p->data<<' '<<endl;
            p=p->rchlid;
        }
    }while (p!=NULL||top>0);
}

后序遍历二叉树的非递归操作:

void NRPostOrder(BiTree BT){//后序遍历二叉树
    BiTree stack[MAX_TREE_SIZE],p;
    int tag[MAX_TREE_SIZE];
    int top=0;
    p=BT;
    do{
        while (p!=NULL){
            top++;
            stack[top]=p;
            tag[top]=0;
            p=p->lchild;
        }
        if(top>0){
            if (tag[top]==1){
                cout<<stack[top]->data<<' '<<endl;
                top--;
            }
            else{
                p=stack[top];
                if (top>0){
                    p=p->rchlid;
                    tag[top]=1;
                }
            }
        }
    } while (p!=NULL||top>0);
}

菜单页面:

 void Menu(){
        printf("          二叉树\n");
        printf("----------------------------------------------\n");
        printf(" 菜单选项:\n");
        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<<"请选择您需要的操作:";
    }

主函数:

   int main()  {
        BiTree BT,p;
        int n,count_leaves=0,deep_tree,count_Node=0;
        int flag=0;
        Menu();
        cin>>n;
        while(n!=8){
            switch(n){
                case 1:
                    flag=CreateBiTree(BT,count_Node);
                    if(flag==1) cout<<"创建成功!"<<endl;
                    break;
                case 2:
                    PreOrder (BT);
                    break;
                case 3:
                    InOrder (BT);
                    break;
                case 4:
                    PostOrder (BT);
                    break;
                case 5:
                    NRPerOrder(BT);
                    break;
                case 6:
                    NRInOrder(BT);
                    break;
                case 7:
                    NRPostOrder(BT);
                    break;
                default:
                    cout<<"输入有误,请重新输入:";
                    break;
            }
            cout<<"请继续选择您的操作:";
            cin>>n;
        }
        free (BT);
        return 0;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值