数据结构之实验一:二叉树的基本操作

一、实验目的:

1.掌握二叉树的定义;
2.掌握二叉树的基本操作,如二叉树的建立、遍历、结点个数统计、树的深度计算等。

二、实验内容:

用递归的方法实现以下算法:

1.以二叉链表表示二叉树,建立一棵二叉树;
2.输出二叉树的中序遍历结果;
3.统计二叉树的叶结点个数;

#include <iostream>
using namespace std;
//二叉链表的定义
typedef struct BiNode{
    char data;
    struct BiNode *lchild,*rchild;
} BiTNode,*BiTree;

//以二叉链表表示二叉树,建立一棵二叉树,传入一个头指针&T
//按先序遍历输入二叉树的值(字符),’#‘表示空结点
void CreatBiTree(BiTree &T){
    char ch;
    cin>>ch;
    if(ch == '#') T=NULL;
    else{
        T = new BiTNode;
        T->data=ch;
        CreatBiTree(T->lchild);
        CreatBiTree(T->rchild);
    }
}

//中序遍历二叉树
void InOrderTraverse(BiTree T){
    if(T){
        InOrderTraverse(T->lchild);
        cout << T->data;
        InOrderTraverse(T->rchild);
    }
}

//统计二叉树的叶节点的个数
int NodeCount(BiTree T){
    if(T==NULL) return 0;
    else if(T->lchild==NULL & T->rchild==NULL){
        return 1;
    }
    else {
        return NodeCount(T->lchild)+NodeCount(T->rchild);
    }
}
int main() {
    BiTree tree;
    cout<<"请输入建立二叉链表的序列:"<<endl;
    CreatBiTree(tree);
    cout<<"中序遍历的结果为:"<<endl;
    InOrderTraverse(tree);
    cout<<endl;
    cout<<"二叉树中叶节点的个数为:"<<NodeCount(tree);
    cout<<endl;
    return 0;
}

用非递归的方法实现以下算法:
#include <iostream>
using namespace std;

//二叉树的二叉链表表示
typedef struct BiNode{
    char data;
    struct BiNode *lchild,*rchild;
}BiTNode,*BiTree;

//链栈的定义
typedef struct StackNode{
    BiTNode data;
    struct StackNode *next;
}StackNode,*LinkStack;

//按照先序遍历创建二叉树
void CreatBiTree(BiTree &T){
    char ch;
    cin>>ch;
    if(ch == '#') T=NULL;
    else{
        T = new BiTNode;
        T->data=ch;  //生成根节点
        CreatBiTree(T->lchild);
        CreatBiTree(T->rchild);
    }
}

void InitStack(LinkStack &S)
{
    //构造一个空栈S,栈顶指针置空
    S=NULL;
}

bool StackEmpty(LinkStack S)
{
    if(!S) return true;
    else return false;
}

void Push(LinkStack &S,BiTree e)
{
    // 在栈顶插入*e元素
    StackNode *p = new StackNode;
    p->data = *e;
    p->next = S;
    S = p;
}

void Pop(LinkStack &S,BiTree e)
{
    if(S!=NULL)
    {
        *e=S->data;
        StackNode *p=S;
        S=S->next;
        delete p;
    }
}

//中序遍历二叉树
void InOrderTraverse(BiTree T){
    LinkStack S;
    BiTree p;
    BiTree q=new BiTNode;
    InitStack(S);
    p=T;
    while(p||!StackEmpty(S))
    {
        if(p)
        {
            Push(S, p);//p为非空根指针入栈,遍历左子树
            p=p->lchild;
        }
        else
        {
            Pop(S, q); //p为空指针退栈,访问根节点,遍历右子树
            cout<<q->data;
            p=q->rchild;
        }
    }
}
int main(){
    BiTree tree;
    cout<<"请输入建立二叉链表的序列:"<<endl;
    CreatBiTree(tree);
    cout<<"中序遍历的结果为:"<<endl;
    InOrderTraverse(tree);
    cout<<endl;
    return 0;
}

输出结果
请输入建立二叉链表的序列:
ABC##DE#G##F###
中序遍历的结果为:
CBEGDFA
二叉树中叶节点的个数为:3
Program ended with exit code: 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值