樹的各種遞歸算法大集錦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);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM