線索二叉樹的線索化和析構

2021-06-27 15:34:48 字數 3798 閱讀 9981

前段時間學習的二叉樹的相關操作,現在又開始學習線索二叉樹的相關操作,發現網的一些**有問題,所以寫了這篇部落格與大家分享,以下這些**都是我親自編寫以及除錯執行過,有什麼錯的還請大家指出。

線索二叉樹結點的定義如下:

template

<

class

t>

class

threadnode

threadnode

* getleft()

const

threadnode

* getright()

const

void

setleft(

threadnode

* t)

void

setright(

threadnode

* t)

void

setdata(

const

t& item)

void

setlthread(

const

intl)

void

setrthread(

const

intr)

t& getdata()

intgetlthread()

intgetrthread() };

在使用類似於二叉樹的構建方法的情況下,構建乙個二叉樹,然後再使用線索二叉樹的中序線索化函式來線索化二叉樹。

二叉樹的線索化演算法為:

演算法inorder_threading(p)//初始呼叫inorder_threading(root)

ifp≠λ

then

(       inorder_threading ( left(p) ).//中序線索化p的左子樹

ifleft(p) =λ

then//如果p沒有左孩子

(   lthread(p)

1;//p的左指標是線索域

left(p)

pre;//p的左指標指向p的中根前驅

)

ifpre

λ

andright(pre) =λ

then//如果pre沒有右孩子

(     rthread(pre)

1;//pre的右指標是線索域

right(pre)

p;//pre的右指標指向其中根後繼p

)

pre← 

p;//將當前訪問的結點作為pre

inorder_threading ( right(p) );

)

按照這個演算法的思想可以寫出二叉樹的中序線索化函式,如下:

template

<

class

t>

void

threadtree

::inorder_threading(

threadnode

* t) if

(pre

!=null

&& pre

->getright()==

null)

pre=t;

//請將當前訪問的結點作為

pred

inorder_threading

(t->getright());

pre->setrthread(1);

} } 這個函式是我自己親自寫的並且執行過之後顯示正確,但是在網上的大部分二叉樹中序線索化的函式中,都少了最後乙個語句

pre->setrthread(

1下面討論一下線索二線樹的析構,與二叉樹的析構沒有什麼差別,只是在析構的時候要討論結點的左線索與右線索是否為0,**如下:

template

<

class

t>

threadtree

::~threadtree()

template

<

class

t>

void

threadtree

::del(

threadnode

* t) if

(t->getlthread()==0)

if(t->getrthread()==0)

cout

<<

"成功刪除結點

""及其子樹

"<

deletet;

} template

<

class

t>

void

threadtree

::desubtree(

threadnode

* t) if

(t==

root)

threadnode

* p=t;

threadnode

* q=

father

(root

, p);//找

p得父結點

q修改父結點

q的指標域 if

(q->getleft()==p) if

(q->getright()==p)

del(p); }

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

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

線索二叉樹的線索化演算法

在嚴蔚敏的 資料結構 一書中,所使用的 存在一些小問題。原版 就不附上了,主要問題是 1.inthreading函式的引數,應該攜帶pre,這應該是比較嚴重的問題。如果沒有攜帶pre,則對pre的修改只是在呼叫的函式中的區域性變數的值的修改,沒有影響到原來的pre的值。2.在條件語句中,將命中概率高...

線索化二叉樹以及遍歷線索化二叉樹

1.線索二叉樹基本介紹 n個結點的二叉鍊錶中含有n 1 公式 2n n 1 n 1 個空指標域。利用二叉鍊錶中的空指標域,存放指向該結點在某種遍歷次序下的前驅和後繼結點的指標 這種附加的指標稱為 線索 這種加上了線索的二叉鍊錶稱為線索鍊錶,相應的二叉樹稱為線索二叉樹 threaded binaryt...