二叉树的相关操作:创建、查找、求高度和深度、各种遍历(前、中、后、层序)等等

#include <stdio.h>
#include <stdlib.h>
typedef struct BTree
{
    struct BTree *lchild,*rchild;
    char item;
}BTree,*Tree; //BTree内存:两个指针(各占4字节),一个char类型参数(1字节)
typedef struct Queue
{
    int Front,rear;
    BTree *bt[10];
}Queue;
Tree BTcreat();    //二叉树的创建
int  BThigh(Tree );//二叉树的高度=深度+1
int  BTnode(Tree );  //统计二叉树中全部结点个数
int  BTleafnode(Tree );  //统计二叉树中叶结点个数
int  BTsearch(Tree ,char ); //1:有元素 0:树中无此元素
Tree  BTsearch1(Tree ,char ); //返回此元素结点
int  shortestpath(Tree );//输出最短路径长度(根结点到叶结点)
void traverse(Tree ,int );//int 取0(前序)1(中序)2(后序)递归程序
void laytraverse(Tree );//用队列(头部删除,尾部插入属于先进先出)结构实现
int  BTequal(Tree ,Tree );//判断两棵树是否相等(1:相等,0:不等)
void exchange(Tree );//将二叉树的左右子节点交换
int check(Tree ,Tree );//判断两个节点是否相等
int symmetry(Tree );//判断二叉树是否对称(与其“镜像”一样)

int main()
{
    printf("Creat a new Binary Tree:\n");
    BTree *bt = BTcreat();
    printf("The pre-traverse:\n");
    traverse(bt,0);
    printf("\n");
    printf("The indix-traverse:\n");
    traverse(bt,1);
    printf("\n");
    printf("The post-traverse:\n");
    traverse(bt,2);
    printf("\n");
    int h = BThigh(bt);
    int dp = h-1;
    printf("The high of the Binary Tree is %d.\n",h);
    printf("The depth of the Binary Tree is %d.\n",dp);
    int cnt_node = BTnode(bt);
    printf("The node number of the Binary Tree is %d.\n",cnt_node);
    printf("Input the char to be searched: ");
    char ch;
    scanf("%c",&ch);
    int k = BTsearch(bt,ch);
    if(k)
        printf("%c is in the Binary Tree.\n",ch);
    else
        printf("No %c!\n",ch);
    printf("The lay-traverse:\n");
    laytraverse(bt);
    printf("\n");
    BTree *st = bt;
    if(BTequal(bt,st))
        printf("bt and st are equal!\n");
    else
        printf("bt and st are NOT equal!\n");
    int len = shortestpath(bt);
    printf("The shortest path length is:%d\n",len);
    if(symmetry(bt))
        printf("The Binary Tree is symmetric!\n");
    else
        printf("NO symmetric!\n");
    exchange(st);
    traverse(st,0);
    return 0;
}

Tree BTcreat()
{
    BTree *bt;   
    char ch;
    scanf(" %c",&ch);
    if(ch == '#')
        return  NULL;
    else
    {
        bt = malloc(sizeof(*bt));
        bt->item = ch;
        printf("Input the left child:\n");
        bt->lchild = BTcreat();
        printf("Input the right child:\n");
        bt->rchild = BTcreat();
    }
    return bt;
}

void traverse(Tree bt,int k)
{
    switch(k)
    {
case 0:
    if(bt == NULL)
        return;
    else
    {
        printf("%c ",bt->item);
        if(bt->lchild != NULL)
            traverse(bt->lchild,0);
        if(bt->rchild != NULL)
            traverse(bt->rchild,0);
    }
    break;
case 1:
    if(bt == NULL)
        return;
    else
    {
        if(bt->lchild != NULL)
            traverse(bt->lchild,1);
        printf("%c ",bt->item);
        if(bt->rchild != NULL)
            traverse(bt->rchild,1);
    }
    break;
case 2:
    if(bt == NULL)
        return;
    else
    {
        if(bt->lchild != NULL)
            traverse(bt->lchild,2);
        if(bt->rchild != NULL)
            traverse(bt->rchild,2);
        printf("%c ",bt->item);
    }
    break;

    }
}

int BThigh(Tree st)
{
    int hl,hr;
    if(st == NULL)
        return 0;
    else
    {
            hl = BThigh(st->lchild)+1;
            hr = BThigh(st->rchild)+1;
    if(hl > hr)
        return hl;
    else
        return hr;
    }
}

int  BTnode(Tree st)
{
    int cnt;
    if(st == NULL)
        return 0;
    else
    {
       cnt = BTnode(st->lchild)+BTnode(st->rchild)+1;
       return cnt;
    }
}

int  BTleafnode(Tree st)
{
    int cnt;
    if(st == NULL)
        return 0;
    else
    {
        if(st->lchild == NULL && st->rchild == NULL)
            cnt = BTleafnode(st->lchild)+BTleafnode(st->rchild)+1;
        return cnt;
    }
}

int  BTsearch(Tree st,char ch)
{
   if(st == NULL)
     return 0;
   else
   {
       if(st->item == ch)
        return 1;
       else
        {
            int k = BTsearch(st->lchild,ch);
            if(k)
                return k;
            else
              return BTsearch(st->rchild,ch);
        }
   }
}

Tree BTsearch1(Tree st,char ch)  //返回值为BTree型的search
{
    if(st == NULL)
     return NULL;
   else
   {
       if(st->item == ch)
        return st;
       else
        {
            if(BTsearch(st->lchild,ch) == NULL)
              return BTsearch(st->rchild,ch);
        }
   }
}


int  shortestpath(Tree st)
{
    int hl,hr;
    if(st->lchild == NULL && st->rchild == NULL)
        return 0;
    else
    {
        if(st->lchild != NULL)
        hl = shortestpath(st->lchild)+1;
        if(st->rchild != NULL)
        hr = shortestpath(st->rchild)+1;
        if(hl < hr)
            return hl;
        else
            return hr;
    }
}

void laytraverse(Tree st)
{

    Queue q;
    q.Front = 0;
    q.rear = 0;
    if(st != NULL)
        printf("%c ",st->item);
    q.bt[q.Front] = st;
    q.rear = q.rear+1;
    while(q.Front < q.rear)
    {
      st = q.bt[q.Front];
      q.Front = q.Front+1;    //每次移动一位,然后取这位节点的左右子节点,队列中相邻节点属于同一层!
      if(st->lchild != NULL)
      {
          q.bt[q.rear] = st->lchild;
          q.rear = q.rear+1;
          printf("%c ",st->lchild->item);
      }
      if(st->rchild != NULL)
      {
          q.bt[q.rear] = st->rchild;
          q.rear = q.rear+1;
          printf("%c ",st->rchild->item);
      }

    }
}

int  BTequal(Tree st1,Tree st2)
{
    if(st1 == NULL ^ st2 == NULL) //^是异或符号,之前的判断语句是:if(st1->item != st2->item)
        return 0;                   //此判断语句在st1 和st2 为NULL时“调试遇挫”
    else if(st1 == NULL && st2 == NULL)
        return 1;
    else if(st1->item == st2->item)
    {
        if(1 == BTequal(st1->lchild,st2->lchild))
           return BTequal(st1->rchild,st2->rchild);
        else
            return 0;
    }
}

void exchange(Tree st)
{
    if(st == NULL)
        return;
    else
        {
            BTree *tmp;
            tmp = st->lchild;
            st->lchild = st->rchild;
            st->rchild = tmp;
            exchange(st->lchild);
            exchange(st->rchild);
        }
}
int check(Tree p,Tree q)
{
    if(p != NULL && q == NULL)
        return 0;
    else if(p == NULL && q != NULL)
        return 0;
    else if(p != NULL && q != NULL)
    {
        if(p->item != q->item)
          return 0;
        else
        {
            if(check(p->lchild,q->rchild) == 1)
                return check(p->rchild,q->lchild);
        }
    }
    else 
    return 1;
}

int symmetry(Tree st)
{
   if(st == NULL)
        return 1;
   else
     return check(st->lchild,st->rchild);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值