数据结构实验——二叉树的常见操作

要求:

⑴输入字符序列,建立二叉链表。

⑵中序遍历二叉树:递归算法。

⑶中序遍历二叉树:非递归算法。(最好也能实现先序,后序非递归算法)

⑷求二叉树的高度。

⑸求二叉树的叶子个数。

*⑹将二叉链表视为森林的孩子兄弟链表,计算森林中叶子个数。

*⑺建立中序线索二叉树,并实现中序遍历。

⑻借助队列实现二叉树的层次遍历。 

⑼在主函数中设计一个简单的菜单,分别调试上述算法。

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
#define NULL 0
#define N 10
typedef int ELEMTP;
typedef struct node
{
    ELEMTP data;
    struct node *lchild,*rchild;
} TNode;
//创建二叉树
TNode * create_tree()
{
    TNode *t;
    ELEMTP x;
    cin>>x;
    if(x!=0)
    {
        t=new TNode;
        t->data=x;
        t->lchild=create_tree();
        t->rchild=create_tree();
    }
    else
        t=NULL;
    return t;
}
//创建二叉树的另一种方法
void create_tree1(TNode **t)
{
    ELEMTP x;
    cin>>x;
    if(x==0)
        *t=NULL;
    else
    {
        *t=new TNode;
        (*t)->data=x;
        create_tree1(&((*t)->lchild));
        create_tree1(&((*t)->rchild));
    }

}
//递归先序遍历二叉树
void preorder(TNode *t)
{
    if(t)
    {
        cout<<t->data<<"      ";
        preorder(t->lchild);
        preorder(t->rchild);
    }
}
// 递归中序遍历二叉树
void inorder(TNode *t)
{
    if(t)
    {
        inorder(t->lchild);
        cout<<t->data<<"      ";
        inorder(t->rchild);
    }
}
//递归后序遍历二叉树
void pasorder(TNode *t)
{
    if(t)
    {
        pasorder(t->lchild);
        pasorder(t->rchild);
        cout<<t->data<<"      ";
    }
}
//递归算法求二叉树叶子结点数
void count_leaf(TNode *t,int *n)
{
    if(t)
    {
        if(t->lchild==NULL && t->rchild==NULL)
            (*n)++;
        count_leaf(t->lchild,n);
        count_leaf(t->rchild,n);
    }
}
//递归算法求二叉树的高度
int hight_bit(TNode *t)
{
    int l,h;
    if(t)
    {
        l=hight_bit(t->lchild);
        h=hight_bit(t->rchild);
        if(l>h)
            return l+1;
        else
            return h+1;
    }
    else
        return 0;
}
//递归算法将二叉树的左右子数交换
void exchange(TNode **t)
{
    TNode *p;
    if(*t)
    {
        exchange(&((*t)->lchild));
        exchange(&((*t)->rchild));
        p=(*t)->lchild;
        (*t)->lchild=(*t)->rchild;
        (*t)->rchild=p;
    }
}


//非递归先序遍历算法
void preorder1(TNode *t)
{
    TNode * s[N],*p;
    int top;
    top=0;
    p=t;
    while(p || top>0)
    {
        while(p)
        {
            cout<<p->data<<"      ";
            top++;
            s[top]=p;
            p=p->lchild;
        }
        if(top>0)
        {
            p=s[top];
            --top;
            p=p->rchild;
        }
    }
}
//二叉树中序非递归算法
void inorder1(TNode *t)
{
    TNode *p,*s[N];
    int top;
    top=0;
    p=t;
    while(p || top>0)
    {
        while(p)
        {
            top++;
            s[top]=p;
            p=p->lchild;
        }
        if(top>0)
        {
            p=s[top];
            top--;
            cout<<p->data<<"      ";
            p=p->rchild;
        }
    }
}
//二叉树后根非递归算法
void pasorder1(TNode *t)
{
    struct
    {
        TNode *pp;
        int tag;
    } ss[N];
    int top;
    TNode *p;
    top=0;
    p=t;
    while(p || top>0)
    {
        while(p)
        {
            top++;
            ss[top].tag=0;
            ss[top].pp=p;
            p=p->lchild;
        }
        if(top>0)
            if(ss[top].tag==0)
            {
                ss[top].tag=1;
                p=ss[top].pp;
                p=p->rchild;
            }
            else
            {
                p=ss[top].pp;
                cout<<p->data<<"      ";
                top--;
                p=NULL;
            }
    }
}
//非递归先序方法求二叉数叶子结点数
void count_leaf1(TNode *t,int *n)
{
    TNode *s[N],*p;
    int top;
    top=0;
    p=t;
    while(p || top>0)
    {
        if(p)
        {
            if(p->lchild==NULL && p->rchild==NULL)
                (*n)++;
            top++;
            s[top]=p;
            p=p->lchild;
        }
        else
        {
            p=s[top];
            top--;
            p=p->rchild;
        }
    }
}
//非递归中序求二叉树叶子结点数
int count_leaf2(TNode *t)
{
    int n,top;
    TNode *s[N],*p;
    n=0;
    top=0;
    p=t;
    while(p || top>0)
    {
        while(p)
        {
            top++;
            s[top]=p;
            p=p->lchild;
        }
        p=s[top];
        top--;
        if(p->lchild==NULL && p->rchild==NULL)
            n++;
        p=p->rchild;
    }
    return n;
}
//非递归后序求二叉树叶子结点数
int count_leaf3(TNode *t)
{
    struct
    {
        TNode *pp;
        int tag;
    } s[N],ss;
    int top,n;
    TNode *p;
    top=0;
    n=0;
    p=t;
    while(p || top>0)
    {
        while(p)
        {
            top++;
            s[top].pp=p;
            s[top].tag=0;
            p=p->lchild;
        }
        ss=s[top];
        top--;
        if(ss.tag==0)
        {
            ss.tag=1;
            top++;
            s[top]=ss;
            p=ss.pp->rchild;
        }
        else
        {
            p=ss.pp;
            if(p->lchild==NULL && p->rchild==NULL)
                n++;
            p=NULL;
        }
    }
    return n;
}
//求给定结点的所有祖先和祖先数
int count_zx(TNode *t,ELEMTP x)
{
    struct
    {
        TNode *pp;
        int tag;
    } s[N],ss;
    int top,n;
    TNode *p;
    top=0;
    n=0;
    p=t;
    while( p || top>0)
    {
        while(p)
        {
            top++;
            s[top].pp=p;
            s[top].tag=0;
            p=p->lchild;
        }
        ss=s[top];
        top--;
        if(ss.tag==0)
        {
            ss.tag=1;
            top++;
            s[top]=ss;
            p=ss.pp->rchild;
        }
        else
        {
            if(ss.pp->data==x)
                break;
            p=NULL;
        }
    }
    cout<<"the zx wei:"<<endl;
    for(n=1; n<=top; n++)
    {
        p=s[n].pp;
        cout<<p->data<<"   ";
    }
    return top;
}
//非递归算法求二叉树的高度算法
int hight_bit1(TNode *t)
{
    TNode * s[N];
    ELEMTP node[N];//保存叶子结点
    int top,i,j,h,n;
    TNode *p;
    top=0;
    n=0;
    p=t;
    while(p || top>0)
    {
        if(p)
        {
            if(p->lchild==NULL && p->rchild==NULL)
                node[n++]=p->data;
            top++;
            s[top]=p;
            p=p->lchild;
        }
        else
        {
            p=s[top];
            top--;
            p=p->rchild;
        }
    }
    cout<<"the leaf is:";
    for(i=0; i<n; i++)
        cout<<node[i];
    h=-32767;
    for(i=0; i<n; i++)
        if(h<count_zx(t,node[i])) //求所在叶结点的祖先数
            h= count_zx(t,node[i])+1;
    return h+1;
}

int  main()
{
    TNode *t;
    int num;
// t=create_tree();
    create_tree1(&t);
    preorder(t);
    cout<<endl;
//  preorder1(t);
//  cout<<endl;
//  inorder(t);
//  cout<<endl;
//  inorder1(t);
//  cout<<endl;
//  pasorder(t);
// cout<<endl;
//  pasorder1(t);
//    cout<<endl;
    num=0;
// count_leaf(t,&num);
// count_leaf1(t,&num);
//num=count_leaf2(t);
    num=count_leaf3(t);
    cout<<"the binary tree's leaf is:"<<num<<"个";
    cout<<endl;
//求给定结点的所有祖先和祖先数
    num=count_zx(t,6);
    cout<<endl<<num;
    cout<<endl;
//递归算法求二叉树的高度
//num= hight_bit(t);
//cout<<"the binary tree's hight is:"<<num;
//cout<<endl;
//num=hight_bit1(t);
// cout<<"the hight is:"<<num;
//递归算法将二叉树的左右子数交换
// exchange(&t);
// cout<<endl;
// preorder(t);
   return 0;
}







 

作者:王老师

(Yran有改动)
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值