日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

双亲表示法、孩子表示法、孩子兄弟表示法(二叉树表示法),森林和二叉树的转换

發布時間:2023/12/8 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 双亲表示法、孩子表示法、孩子兄弟表示法(二叉树表示法),森林和二叉树的转换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

樹的存儲結構

  • 一、雙親表示法
  • 二、孩子表示法(孩子鏈表)
  • 三、孩子兄弟表示法(二叉樹表示法、二叉鏈表表示法)
  • 四、森林(樹)和二叉樹的轉換

一、雙親表示法

實現:定義數組結構存放樹的結點,每個結點含兩個域:
數據域:存放結點本身數據信息。
雙親域:指示本結點的雙親結點在數組中的位置。

結點結構表示為:

dataparent

data是數據域,parent是指針域
例如:

可表示為:

r=0,n=10.(根結點位置和結點個數)

這樣的存儲結構,根據結點parent指針很容易找到它的雙親結點,所用時間復雜度為O(1),直到parent為-1時,找到了樹的根結點,但是我們要知道結點的孩子是什么,對不起,請遍歷整個結構才行。

所以雙親表示法特點是:找雙親容易,找孩子難。

結點結構:

typedef struct PTNode{int data;int parent;//雙親位置域 }PTNode;

樹結構定義:

#define MAX_TREE_SIZE 100 typedef struct{PTNode nodes[MAX_TREE_SIZE];int r,n;//根結點的位置和結點個數 }PTree;

我們可以把結點擴展來解決找孩子結點的問題,但存儲結構的設計是一個非常靈活的過程。一個存儲結構設計的是否合理,取決于基于該存儲結構的運算是否適合、是否方便,時間復雜度好不好等等。

二、孩子表示法(孩子鏈表)

具體辦法是:把每個結點的孩子結點排列起來,看成是一個線性表,以單鏈表作存儲結構,則n個結點有n個孩子鏈表(葉子結點的孩子鏈表為空),然后n個頭指針又組成一個線性表,采用順序存儲結構,存放進一個一維數組中,如圖所示

為此,設計兩種結點結構,一個是孩子鏈表的孩子結點:

childnext

child是數據域,用來存儲某個結點在表頭數組中的下標,next為指針域,存儲指向某結點的下一個孩子結點的指針。

另一個是表頭數組的表頭結點,也就是雙親結點:

datafirst child

其中,data是數據域,firstchild是頭指針域,存儲該結點的孩子鏈表的頭指針。

孩子表示法的結構定義代碼:

孩子結點結構

typedef struct CTNode{//孩子結點int child;struct CTNode *next; }*ChildPtr;

表頭結構(雙親結構)

typedef struct //表頭結構 { int data;ChildPtr firstchild; }CTBox;//孩子鏈表

樹結構:

#define MAX_TREE_SIZE 100 typedef syruct //樹結構 {CTBox nodes[MAX_TREE_SIZE];//結點數組int n,r;//結點數和根結點的位置 }CTree;

特點:找孩子易,找雙親難

這樣的結構對于我們要查找某個結點的某個孩子,或者找某個結點的兄弟,只需要查找這個結點的孩子單鏈表即可。對于遍歷整棵樹也是很方便的,對頭結點的數組循環即可。


但是,要找雙親結點卻很麻煩,我們可以把雙親表示法和孩子表示法綜合一下,稱為雙親孩子表示法,算是孩子表示法的改進。

我們在表頭結構中新增加一個成員即可,存儲雙親下標。為了多存儲雙親,操作方便,我們犧牲了空間。

三、孩子兄弟表示法(二叉樹表示法、二叉鏈表表示法)

任意一棵樹,它的結點的第一個孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。因此,我們用二叉鏈表作樹的存儲結構,鏈表中每個結點的兩個指針域分別指向第一個孩子結點和此結點的下一個兄弟結點
,根結點沒有兄弟,置為空。
結點結構如表:


畫的有些丑,將就著看哈~(最右邊是nextsibling,寫錯了)

//樹的孩子兄弟表示法結構定義 typedef struct CSNode {int data;struct CSNode *firstchild,*nextsibling; }CSNode,*CSTree;//結點類型和指向結點類型的指針,指針表示孩子兄弟表示的二叉鏈表結構

舉例:

這種表示法,給查找某個結點的某個孩子帶來方便,當然想找到結點的雙親,這個表示法也是有缺陷的,所以真的有必要的話,完全可以再增加一個parent指針域來解決快速查找雙親的問題,大家試試吧

此表示法的最大好處就是把一棵復雜度的樹變成了一顆二叉樹。


四、森林(樹)和二叉樹的轉換

1)將樹轉化為二叉樹進行處理,利用二叉樹的算法來實現對樹的操作
2)由于樹和二叉樹都可以用二叉鏈表作存儲結構,則以二叉鏈表作媒介可以導出樹與二叉樹之間的一個對應關系。

  • 將森林轉換成二叉樹
    1)加線:在兄弟之間加一連線
    2)抹線:對每個結點,除了其左孩子外,去除其與其余孩子之間的關系
    3)旋轉:以樹的根結點為軸心,將整數順時針轉45度。
    記憶口訣:兄弟相連留長子
    過程如下:加線->抹線->旋轉

  • 將二叉樹轉換為森林
    步驟:
    1)加線:若p結點是雙親結點的左孩子,則將p的右孩子,右孩子的右孩子… …沿著分支找到所有的右孩子,都與p的雙親用線連起來
    2)抹線:抹掉原二叉樹中雙親與右孩子之間的連線
    3)調整:將結點按層次排列,形成樹結構

  • 記憶口訣:左孩右右連雙線,去掉原來右孩線
    過程如下:加線->抹線->調整(旋轉)


    內容參考:
    《數據結構》嚴蔚敏

    總結

    以上是生活随笔為你收集整理的双亲表示法、孩子表示法、孩子兄弟表示法(二叉树表示法),森林和二叉树的转换的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。