树的各种递归算法大集锦1

#include  <stdlib.h>
#include  <conio.h>
#include  <stdio.h>
#include  <stdbool.h>

  struct BiTNode {
      int data;
      struct TreeNode *lchild,*rchild;
  }BiTNode, *BiTree;
  
  //输出二叉树的所有结点个数
int Put(BiTree b)
{
    if(b==NULL)
        return 0;
    else
        return Put(b->lchild)+Put(b->rchild)+1;
}

//计算二叉树中双分支结点的个数
int Double(BiTree b)
{
    if(b==NULL)
        return 0; //返回的树的高度为0
    if(b->lchild!=NULL&&b->rchild!=NULL)
        return Double(b->lchild)+Double(b->rchild)+1;
    else
        return Double(b->lchild)+Double(b->rchild);
}

//计算二叉树中单分支结点的个数
int Single(BiTree b)
{
    if(b==NULL)
        return 0;
    if((b->lchild!=NULL)&&(b->rchild==NULL)||(b->lchild==NULL)&&(b->rchild!=NULL))
        return Single(b->lchild)+Single(b->rchild)+1;
    else
        return Single(b->lchild)+Single(b->rchild);
}


 //输出二叉树中的所有叶子节点 
void Putleaf(BiTree b)
{
    if(b!=NULL)
    {
        if(b->lchild=NULL&&b->rchild=NULL) //若是叶子节点递归输出
            printf("%c",b->data);
        Putleaf(b->lchild);//其他结点
        Putleaf(b->rchild);
    }
}



//输出二叉树中的所有双分支结点
int Pdouble(BiTree b)
{
    if(b!=NULL)
    {
        if(b->lchild!=NULL&&b->rchild!=NULL) //若是叶子节点递归输出
            printf("%c",b->data);
        Putleaf(b->lchild);//其他结点
        Putleaf(b->rchild);
    }
}

//求二叉树第k层结点个数

void Lnodenum((BiTree b,int h,int k,int &n)
{ //h表示b所指的结点层次,初值为1
    if(b==NULL)
        return;
    else    //处理非空树
    {
        if(h==k) n++;  //当访问的结点在第k层时n增1
        else  //若当前访问的结点层次小于k,递归处理左右子树
        {
            Lnode(b->lchild+1,h+1,k,n);
            Lnode(b->rchild+1,h+1,k,n);
        }
    }
}

int n=0; //全局变量,用于记录第k层结点的个数
void Lnodenum(BiTree b,int h,int k)
{ //h表示b所指的结点层次
    if(b==NULL)
        return;
    else
    {
        if(h==k) n++;
        else if(h<k)
        {
            Lnode(b->lchild,h+1,k);
            Lnode(b->rchild,h+1,k);
        }
    }
}

//删除二叉树中以元结点值x为的根节点的子树
void Del(BiTree b,Elemtype x)
{ //基于先序遍历的递归算法,先找到值为x的结点p,然后调用DestoryBTree(p)删除并释放该子树
    if(b==NULL)
        return;
    if(b->data==x)
    {
        DestoryBTree(b);
        b = NULL;
    }
    else
    {
        Del(b->lchild,x);
        Del(b->rchlid,x);
    }
}
void DestoryBTree(BiTree &b)
{ //释放二叉树b中所有结点分配的空间
    if(b!=NULL)
    {
        DestoryBTree(b->lchild);
        DestoryBTree(b->rchild);
        free(b);
    }
}

 

//求先序遍历序列中的第k(1<=k<=二叉树中结点的个数)个结点的值
int i=1;   //遍历序号的全局变量
Elemtype Search(BiTree b,int k)
{
    if(b==NULL)
        return '#';
    if(i==k)
        return b->data;
    i++;
    ch = Search(b->lchild,k);
    if(ch!='#')
        return ch;
    ch = Search(b->rchild,k);
        return ch;
}
/*
设置一个全局变量记录已访问的结点的序号,其初值是根节点在先序序列中的序号,即1.
当二叉树为空时,返回'#',当i==k时返回b->data,
当i!=k时递归的在左子树中查找,若找到返回该值,否则继续递归右子树查找,并返回其结果
*/

//判断两棵二叉树是否相似的算法
bool Like(BiTree b1,BiTree b2)
{
    bool like1,like2;
    if(b1==NULL&&b2==NULL)
        return true;
    else if((b1==NULL||b2==NULL)
        return false;
    else
    {
        like1 = Like(b1->lchild,b2->lchild);
        like2 = Like(b1->rchild,b2->rchild);
        return (like1&&like2);  //返回like1,like2与运算的结果
    }
}

//判断一棵二叉树b的左右子树是否同构
bool Like(BiTree b1,BiTree b2) //判断二叉树b1,b2是否同构
{
    bool like1,like2; 
    if(b1==NULL&&b2==NULL)
        return true;
    else if(b1==NULL||b2==NULL)
        return false;
    else
    {
        like1 = Like(b1->lchild,b2->lchild);
        like2 = Like(b1->rchild,b2->rchild);
        return (like1&&like2);
    }
}
bool LikeBiTree(BiTree b) //判断二叉树的左右子树是否同构
{
    if(b==NUL)
        return true;
    else
        return Like(b->lchild,b->rchild);
}

 

posted @ 2019-08-09 18:33  小孢子  阅读(1517)  评论(0编辑  收藏  举报