二叉樹線索化

2022-08-27 01:42:08 字數 3785 閱讀 4994

線索二叉樹

按照某種遍歷方式對二叉樹進行遍歷,可以把二叉樹中所有結點排序為乙個線性序列。在改序列中,除第乙個結點外每個結點有且僅有乙個直接前驅結點;除最後乙個結點外每乙個結點有且僅有乙個

直接後繼結點。這些指向直接前驅結點和指向直接後續結點的指標被稱為線索(thread),加了線索的二叉樹稱為線索二叉樹。

當用二叉鍊錶作為二叉樹的儲存結構時,因為每個結點中只有指向其左、右兒子結點的指標,所以從任一結點出發只能直接找到該結點的左、右兒子。在一般情況下靠它無法直接找到該結點在某種

遍歷序下的前驅和後繼結點。如果在每個結點中增加指向其前驅和後繼結點的指標,將降低儲存空間的效率。

我們可以證明:在n個結點的二叉鍊錶中含有n+1個空指標。因為含n個結點的二叉鍊錶中含有2n個指標,除了根結點,每個結點都有乙個從父結點指向該結點的指標,因此一共使用了n-1個指標,所  以在n個結點的二叉鍊錶中含有n+1個空指標。

因此可以利用這些空指標,存放指向結點在某種遍歷次序下的前驅和後繼結點的指標。這種附加的指標稱為線索,加上了線索的二叉鍊錶稱為線索鍊錶,相應的二叉樹稱為線索二叉樹(threadedbinarytree)。根據線索性質的不同,線索二叉樹可分為前序線索二叉樹、中序線索二叉樹和後序線索二叉樹三種。

程式**:

1 #include2

using

namespace

std;

3 typedef enum

4pointertag;

8 template

9struct

binarytreenodethd

1018   binarytreenodethd(const t&data)

19:_data(data), _left(null), _right(null), _lefttag(link), _righttag(link)

20{}

21};

2223 template

24class

binarytreethd

2529   binarytreethd(const t*a, size_t size)

3034   binarytreethd(const binarytreethd&t)

3538

void

inorderthreading()

3943

void

prevorderthreading()

4448

void

postorderthreading()

4953

54public:55

void

inorderthd()

5664        cout<_data>

65while(cur&&cur->_righttag ==thread)

6670        cur = cur->_right;71}

72      cout <

74void

prevorderthd()

7584       cout << cur->_data << "";

85while (cur&&cur->_righttag ==thread)

8690

if (cur->_lefttag ==link)

91       cur = cur->_left;

92else

93      cur = cur->_right;94}

95}9697

protected

:98   binarytreenodethd* _createtree(const t*a, size_t size, size_t &index)

99107

return

root;

108}

109110

void _inorderthreading(binarytreenodethd* cur, binarytreenodethd*&prev)

111120

121if (prev&&prev->_righttag ==null)

122126

127       prev =cur;

128129       _inorderthreading(cur->_right, prev);

130131

}132

133void _prevorderthreading(binarytreenodethd*cur, binarytreenodethd*&prev)

134139

if (cur->_left ==null)

140144

145if (prev&&prev->_right==null)

146147

154155     prev =cur;

156157

if (cur->_lefttag ==link)

158159

164165if (cur->_righttag ==link)

166167

170171

}172

173void _postorderthreading(binarytreenodethd*cur, binarytreenodethd*&prev)

174179          _postorderthreading(cur->_left, prev);

180         _postorderthreading(cur->_right, prev);

181182

if (cur->_left ==null)

183187

if (prev&&prev->_right ==null)

188192         prev =cur;

193}

194195   binarytreenodethd* _copy(binarytreenodethd*root)

196204

205206

207/*

binarytreethd& operator=(binarytreethd*& t)

208214

return *this;

215}

*/216

//binarytreenodethd& operator=(binarytreenodethdt)

217//

221222

protected

:223    binarytreenodethd*_root;

224};

225int

main()

226;

228   binarytreethd t(a, 10

);229   binarytreethdtemp;

230t.inorderthd();

231t.inorderthreading();

232//

t.prevorderthreading();

233//

t.postorderthreading();

234   cout <

235   system("

pause");

236return0;

237 }

二叉樹線索化

二叉樹的線索化可以使得二叉樹的非遞迴遍歷不需借助棧或佇列這種資料結構,最主要的是可以為之提供迭代器。線索化二叉樹有三種方式 前序線索化 中序線索化 後序線索化 後序線索化需要三叉鏈結構 這裡主要講前序線索化和中序線索化,並為中序線索化提供迭代器。線索化的思想就是將一顆二叉樹遍歷轉換成有序雙向鍊錶進行...

二叉樹線索化

名稱 二叉樹線索化 說明 這個東西,一開始弄起來,我去,感覺老複雜了。照著書上看了好久,愣是沒看懂,照著敲了一遍,又手動模擬推了一遍,有了一點思路。照著把後序的線索化和遍歷也敲出來了。這裡要注意的是 對於中序來說,其能線索化後訪問到其前驅和後繼 可以理解為不通過棧訪問到 而對於後序來說,其只能不通過...

二叉樹線索化

public void infixthrnodes treenode node infixthrnodes node.lchild if node.lchild null if pre null pre.rchild null pre node infixthrnodes node.rchild 0...