C 實現鏈式儲存線索二叉樹

2021-10-21 15:04:05 字數 2824 閱讀 6606

一顆線索二叉樹:

根據下圖進行節點的建立:

**如下:

因為普通二叉樹有空指標域,所以我們可以利用這些空指標來線索化

1、二叉樹的線索化,實質上就是遍歷一棵二叉樹,在遍歷過程中,訪問節點的操作是檢查當前結點的左右指標域是否為空,如果為空,即將他們改為前驅節點或後繼節點的線索。為記錄前驅節點,定義pre為全域性變數,始終指向當前結點的前驅節點。

定義乙個全域性變數指向線索二叉樹的前驅節點:

bithrnode *pre;
中序遍歷進行線索化:

void

inthreading

(bithrtree p)if(

!pre-

>rchild)

pre = p;

inthreading

(p->rchild);}

}

根據下圖建立頭結點,線索化:

**如下:

bool

inorderthr

(bithrnode *head,bithrtree t)

else

return

true

;}

對於中序線索二叉樹上的任意節點,尋找其中序的前驅節點,有以下兩種情況:

1、如果該節點的左標誌域為1,那麼其左指標所指向的節點便是它的前驅節點。

2、如果該節點的左標誌為0,表明該節點有左孩子,根據中序遍歷的定義,它的前驅節點是以該節點的左孩子為根節點的子樹的最右節點,即沿著其左子樹的右指標鏈向下查詢,當某節點的右標誌域為1時,它就是所要找的前驅節點。

在中序線索二叉樹上查詢任意節點的中序前驅節點:

bithrnode *

inprenode

(bithrnode *p)

}return pre;

}

對於中序線索二叉樹上的任意節點,尋找其中序的後繼節點,有以下兩種情況:

1、如果該節點的右標誌域為1,那麼其右指標所指向的節點便是它的後繼節點。

2、如果該節點的右標誌為0,表明該節點有右孩子,根據中序遍歷的定義,它的後繼節點是以該節點的右孩子為根節點的子樹的最左節點,即沿著其右子樹的左指標鏈向下查詢,當某節點的左標誌域為1時,它就是所要找的後繼節點。

在中序線索二叉樹上查詢任意節點的中序後繼節點:

bithrnode *

inpostnode

(bithrnode *p)

}return post;

}

從最後乙個節點根據前驅節點進行線索二叉樹的遍歷:

void

inorderpre

(bithrnode *head)

}

從第乙個節點根據後繼節點進行線索二叉樹的遍歷:

void

inorderpost

(bithrnode *head)

while

(p !=

null

&& p != head)

}

完整**如下:

#include

using

namespace std;

typedef

char elemtype;

typedef

struct bithrnode bithrnode,

*bithrtree;

bithrnode *pre;

//定義乙個全域性變數指向線索二叉樹的前驅節點

void

inthreading

(bithrtree &p)if(

!pre-

>rchild)

pre = p;

inthreading

(p->rchild);}

}bool

inorderthr

(bithrtree &head, bithrtree t)

else

return

true;}

bithrnode *

inprenode

(bithrnode *p)

}return pre;

}bithrnode *

inpostnode

(bithrnode *p)

}return post;

}void

inorderpre

(bithrnode *head)

}void

inorderpost

(bithrnode *head)

while

(p !=

null

&& p != head)

}void

createbitree

(bithrtree &t)

}int

main()

測試效果圖:

二叉樹的鏈式儲存結構(線索二叉樹)

一 鏈式儲存結構 由於順序儲存二叉樹的空間利用率較低,因此二叉樹一般都採用鏈式儲存結構,用鍊錶結點來儲存二叉樹中的每個結點。在二叉樹中,結點結構通過包括若干資料域和若干指標域,二叉鍊錶至少包含3個域 資料域 data 左指標域 lchild和右指標域 rchild,如下圖所示 其中,n 個結點的二叉...

二叉樹鏈式儲存的C實現

在實現二叉樹的鏈式儲存的過程中,我遇到了一些問題,感到對遞迴的理解還不夠深入。另外,中有一處必須使用全域性變數做陣列索引,還在研究其中的原因,已完成,現在貼在部落格中供參考 include include include include define maxsize 100 define ok 1 ...

(C )二叉樹的線索化 線索二叉樹

線索化標誌tag enum pointertag 結點結構 template struct binarytreenodethd 基類迭代器 template struct binarytreeiterator t operator t operator bool operator const sel...