一、線索二叉樹
(1)什麼是線索化
將二叉樹以某種次序將其遍歷, 得到線性序列, 就是將非線性結構進行線索化。
線索化的優點就是可以很快地得到前驅或後繼。
如果儲存線索化的線性序列
儲存二叉樹地線索化序列的其中一種方法就是在結點上加兩個指標, 乙個指向前驅乙個指向後繼, 這樣的缺點就是儲存密度大大降低。另一種方法就是加兩個標記 充分利用空指標。
實現方法一
儲存結構
left
ltag
data
rtag
right
//儲存結構
typedef
enum
pointertag;
// 列舉 標誌
typedef
struct node
*node;
以這種結構構成的二叉鍊錶作為二叉樹的儲存結構, 叫做線索鍊錶,其中指向前驅和後繼的指標叫做線索。加上線索的二叉樹稱之為線索二叉樹。
中序的實現**
#include
using
namespace std;
typedef
enum
pointertag;
// 列舉 標誌
typedef
struct node
*node;
char preorder[60]
;int i;
// 每次建樹的時候初始化左右tag為 link
node pre;
// 指向上乙個被訪問的結點
void
inorder
(node t)
// 通過中序遍歷 構建 中序的線索二叉樹if(
!pre-
>right)
// 處理上乙個結點的後繼指標
pre = t;
inorder
(t->right)
;// 中序遍歷右子樹
}void
inorderthread
(node t)
// 線索二叉樹的遍歷
p = p-
>right;
// 如果右右子樹是兒子 那麼就指向兒子 重複迴圈}}
void
create()
void
init()
intmain()
return0;
}
實現方法二
先序的線索二叉樹的**:
#include
using
namespace std;
typedef
struct node // 結點
node,
*node;
int i;
char s[56]
;node last;
node create()
node t =
(node)
malloc
(sizeof
(node));
t->data = s[i++];
t->left =
create()
; t-
>right =
create()
; t-
>next =
null
; t-
>last =
null
;return t;
}void
preorder
(node t)
intmain()
}return0;
}
樹與二叉樹 線索二叉樹
若結點有左子樹,則其lchild域指向其左子樹,否則令lchild域指向其前驅 若結點有右子樹,則其rchild域指向其右子樹,否則令rchild域指向其後繼 為了避免混淆,需要改變結點結構,增加兩個標誌域,ltag,rtag,結構如下圖所示 0 lchild域指向其左子樹 1 lchild域指向其...
二叉樹 線索二叉樹(C )
由於傳統的二叉樹鍊錶儲存僅能體現一種父子關係,不能直接得到結點在遍歷中的前驅或後繼,於是引入了線索二叉樹。遍歷二叉樹是以一定的規則將二叉樹中的結點排列成乙個線性序列,從而得到幾種遍歷序列,使得該序列中的每個結點 第乙個和最後乙個結點除外 都有乙個直接前驅和直接後繼。引入線索二叉樹正是為了加快查詢結點...
順序儲存二叉樹 線索化二叉樹
二叉樹並不是每乙個指標都能夠都能完全被利用上,葉子節點的兩個指標都沒有被引用,為空。希望充分利用其所有指標,在二叉樹的順序儲存結構中用其剩餘指標分切指向某種遍歷順序下前驅節點和後繼節點 圖示 先線索化左子樹 threadednotes node.getleft 線索化當前節點 先處理當前節點的前驅節...