码迷,mamicode.com
首页 > 编程语言 > 详细

树的各种递归算法大集锦

时间:2019-08-09 19:50:16      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:style   tor   左右   基于   double   个数   single   遍历   turn   

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

 

树的各种递归算法大集锦

标签:style   tor   左右   基于   double   个数   single   遍历   turn   

原文地址:https://www.cnblogs.com/spore/p/11329013.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!