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