雙向鍊錶和二叉樹鍊錶區別為:節點指標數量不同、訪問方向許可權不同、節點儲存內容不同。雙向鍊錶和二叉樹鍊錶都能從鍊錶中的任何乙個結點出發能找到任何其他結點。都用來存放線性陣列中的資料元素。
一、節點指標數量不同
1、雙向鍊錶:雙向鍊錶的每個資料結點中包含乙個元素和兩個指標。
2、二叉樹鍊錶:二叉樹鍊錶的每個資料結點中包含乙個元素和只有乙個指標。
二、訪問方向許可權不同
1、雙向鍊錶:雙向鍊錶除了首尾節點,其他節點都能訪問他的前節點和後節點。雙向鍊錶節點兩個指標分別指向前一節點和後一節點。
2、二叉樹鍊錶:二叉樹鍊錶是單向鍊錶,只能指向前面節點。不能向後。二叉樹鍊錶的每個節點只能訪問他的左右孩子節點,不能向上訪問他的父節點。
三、節點儲存內容不同
二叉樹與雙向鍊錶都是一種極其重要的資料結構。它們與陣列、向量、鍊錶一樣都是一種順序容器,提供了按位置訪問資料的方法。但是有乙個缺點,它們都是按照位置來確定資料,想要通過值來查詢資料,只能通過遍歷的方式實現。而二叉樹在很大程度上解決了這個缺點,二叉樹是按值來儲存元素,也按值來訪問元素。而雙向鍊錶的每個節點都只能儲存兩個指標。
舉例:
二叉樹(binary tree)是樹形結構的乙個重要型別。許多實際問題抽象出來的資料結構往往是二叉樹形式,即使是一般的樹也能簡單地轉換為二叉樹,而且二叉樹的儲存結構及其演算法都較為簡單,因此二叉樹顯得特別重要。二叉樹特點是每個結點最多只能有兩棵子樹,且有左右之分。
下圖為乙個最基本的普通二叉樹鍊錶。
二叉樹的儲存
1,順序儲存
使用一維陣列儲存二叉樹中的結點,並且結點的儲存位置,就是陣列的下標索引。
用陣列順序儲存一般只適合完全二叉樹,如果二叉樹出現傾斜情況,採用順序儲存的方式將是十分浪費空間
比如上面的489沒有的話
儲存表現形式將是如下(^代表為空):
2,二叉鍊錶儲存
這個就跟雙向鍊錶有點兒像了
採用鏈式儲存。由二叉樹定義可知,二叉樹的每個結點最多有兩個孩子。因此,可以將結點資料結構定義為乙個資料和兩個指標域
下面為二叉樹鍊錶節點定義**:
//定義結點**:
typedef struct bitnode bitnode, *bitree;
下面為雙向鍊錶結構定義:
// c++ 64位雙向鍊錶
typedef struct list_entry64 list_entry64;
typedef list_entry64 *plist_entry64;
// delphi 64位雙向鍊錶
plist_entry64 =^list_entry64;
list_entry64 =packed record
flink:pvoid64;//ulonglong; //8byte
blink:pvoid64;//ulonglong;
end;
// delphi 32位雙向鍊錶
plistentry = ^tlistentry;
_list_entry = record
flink: plistentry;
blink: plistentry;
end;
tlistentry = _list_entry;
list_entry = _list_entry;
// c++ 32位雙向鍊錶
typedef struct _list_entry list_entry,*plist_entry,*restricted_pointer prlist_entry;
注:list_entry 雙向鍊錶結構在windows中一般主要用於核心態一句話總結:雙向鍊錶是指除了首尾節點,其他節點都能訪問他的前節點和後節點。二叉樹鍊錶就是二叉樹,每個節點只能訪問他的左右孩子節點,不能向上訪問他的父節點,所以二叉樹是單向的 二叉樹轉雙向鍊錶
include using namespace std 樹節點 struct node typedef struct node link 構造樹 void insert tree link h,int t if h val t insert tree h left,t else insert tre...
二叉樹轉雙向鍊錶
1.a 遞迴轉化左子樹為雙向鍊錶 1.b 找出根結點的前驅節點 是左子樹的最右的節點 1.c 將上一步找出的節點和根結點連線起來 2,如果右子樹不為null,處理右子樹 和上面的很類似 1.a 遞迴轉化右子樹為雙向鍊錶 1.b 找出根結點的後繼節點 是右子樹的最左的節點 1.c 將上一步找出的節點和...
二叉樹轉雙向鍊錶
這是一道挺有趣的題,其解題的思路主要還是二叉樹的中序遍歷 先建立乙個頭結點list,然後通過中序遍歷二叉樹,把結點串起來即可!注意點 1 需要有乙個指標來指向上乙個已遍歷過的結點 2 如果不建立頭結點,在後面遍歷判斷時比較麻煩 include using namespace std struct n...