• 树的各种递归算法大集锦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);
    }
  • 相关阅读:
    WPF Prefix 'attach' does not map to a namespace.
    C# 用ManulResetEvent 控制Thread的 Suspend、Resume
    C# 监控Windows睡眠与恢复
    c# DataTable to Object Mapping
    C# DispatcherTimer Start之后立即执行
    Visual studio 编译时copy文件、文件夹
    c# 无法加载xxx.dll 找不到指定的模块(如何指定文件夹)
    EntityFramework 找不到方法:“Void System.Data.Entity.DbModelBuilder.RegisterEntityType
    wpf 全局异常捕获处理
    pandas入门
  • 原文地址:https://www.cnblogs.com/spore/p/11329013.html
Copyright © 2020-2023  润新知