树的各种递归算法大集锦

Posted 万事开头难

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树的各种递归算法大集锦相关的知识,希望对你有一定的参考价值。

#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);
    }
}

 

以上是关于树的各种递归算法大集锦的主要内容,如果未能解决你的问题,请参考以下文章

每日一题如何进行二叉树的各种遍历的非递归算法实现?简要讲述。

二叉树的前中后序递归和非递归遍历操作代码

实验:二叉树的递归遍历算法

二叉树遍历算法

数据结构的实践心得(二叉树的抽象数据结构和各种遍历的递归及非递归实现,以及哈夫曼算法应用:binaryTree)

二叉树的实验--二叉树的主要遍历算法