樹的孩子兄弟表示法建樹



  樹的表示方法有很多,在董永建老師的一本通里也有介紹,其中一種表示方法為孩子兄弟表示 法,但董老師沒給出例程,經本人琢磨,勉強寫了一個。

  如右圖所示一棵,樹的建立基本仿照擴展二叉樹的原理,建樹時,首先輸入根值,接着再輸入其所有孩子的值,以0結束。(若輸入某個節點的所有孩子時,直接輸入0,則說明這是一個葉節點,沒有孩子)。

  根據這一規則,右圖所示的樹可依次輸入1 2 4 0 3 0 0 5 6 0 0 7 0 0。為了檢查是否建樹成功,順便寫了個先根遍歷輸出,結果為:1-2-3-4-5-6-7。實現原理:單鏈表結構。

#include<iostream>
using namespace std;
typedef struct node;
typedef node * tree;
struct node{//孩子兄弟表示法 
    int n;
    tree ch,next;//分別存放第一個孩子,並用鏈表結構存其兄弟 
};
void creat(tree &p)
{
    cout<<p->n<<':';//輸出根值,方便輸入,其后依次輸入各個孩子,以0結束 
    int x;
    //開始輸入第一個孩子 
    cin>>x;
    if(x)
    {
        p->ch=new node;
        p->ch->n=x,p->ch->next=NULL,p->ch->ch=NULL;
    }
    else
    {
        p->ch=NULL; 
         return;//第一個孩子不存在,就不會有第二個孩子,也不會有孫子 
    }
    //輸入第一個孩子的兄弟 
    tree t=p->ch;
    cin>>x;
    while(x)
    {
        t->next=new node;
        t->next->n=x;
        t=t->next;
        t->ch=NULL,t->next=NULL;
        cin>>x;
    }
    //遞歸每一個孩子的子樹 
    t=p->ch;
    while(t)
     {
         creat(t);
         t=t->next;
     }
}
void pr(tree p)//前序輸出這棵樹 
{
    tree t=p->ch;
    while(t)
    {
        cout<<'-'<<t->n;
        pr(t);
        t=t->next;
    }
}
int main(){
    tree p=new node,h;
    h=p;
    cin>>p->n;
    creat(p);
    cout<<p->n;
    pr(p);
    return 0;
}
全樹程序

   如果樹是二叉樹,當然程序應該可以更簡單一些。(每次都輸入左、右兒子的值,如果相應兒子沒就輸入0,最后不用補0)。樣例輸入1 2 4 3 0 0 0 5 6 0 0 7 0 0 0。樣例輸出:1 2 3 4 5 6 7。

#include<iostream>
using namespace std;
typedef struct node;
typedef node *tree;
struct node{
    int num;
    tree l,r;
}; 
void bult(tree &p)//引用形參,確保數據同步更改 
{
    int x,y;
    cout<<p->num<<':';
    cin>>x>>y;
    if(x)
    {
        p->l=new node;
        p->l->num=x;
        bult(p->l);
    }
    else p->l=NULL;
    if(y)
    {
        p->r=new node;
        p->r->num=y;
        bult(p->r);
    }
    else p->r=NULL;
}
void pr(node *p)
{
    if(p)
    {
        cout<<p->num<<' ';
        pr(p->l);
        pr(p->r);
    }
}
int main(){
    node *h,*p=new node;
    h=p;
    cin>>p->num;
    bult(p);
    pr(h);
    return 0;
}
二叉樹程序

 

  如有寫的不妥,請大神指教,不勝感激!


免責聲明!

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



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