線索化二叉樹

2021-07-29 09:33:55 字數 3959 閱讀 3313

二叉樹是一種非線性結構,遍歷二叉樹幾乎都是通過遞迴或者用棧輔助實現非遞迴的遍歷。用二叉樹作為儲存結構時,取到乙個節點,只能獲取節點的左孩子和右孩子,不能直接得到節點的任一遍歷序列的前驅或者後繼。

為了儲存這種在遍歷中需要的資訊,我們利用二叉樹中指向左右子樹的空指標來存放節點的前驅和後繼資訊.

二叉樹的結構

enum pointertag

;template

struct binarytreenode_thd

binarytreenode_thd(const t& d)

: _date(d)

, _left(null)

, _right(null)

, _lefttag(link)

, _righttag(link)

{}t _date; //資料

binarytreenode_thd* _left; //左孩子

binarytreenode_thd* _right;//右孩子

pointertag _lefttag; //左孩子線索標誌

pointertag _righttag; //右孩子線索標誌

2.中序線索化

void inorderthreading()

//中序線索化遍歷

void inorderthd()

cout << cur->_date <<

" ";

while (cur->_lefttag ==

thread)

cur = cur->_right;

}cout << endl;

}

//中序線索化

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

if (prev && prev->_right ==

null)

prev = cur;

_inorderthreading(cur->_right, prev); //右子樹

}

3.前序線索化

//前序線索化

void prevorderthreading()

//前序線索化遍歷

4.後序線索化

//後序線索化

void postorderthreading()

//後序線索化

5.完整**

#include

#include

using namespace std;

enum pointertag

;template

struct binarytreenode_thd

binarytreenode_thd(const t& d)

: _date(d)

, _left(null)

, _right(null)

, _lefttag(link)

, _righttag(link)

{}t _date; //資料

binarytreenode_thd* _left; //左孩子

binarytreenode_thd* _right;//右孩子

pointertag _lefttag; //左孩子線索標誌

pointertag _righttag; //右孩子線索標誌

};template

class binarytreethread

binarytreethread(t* a, size_t n, const t& invalid)

//中序線索化

void inorderthreading()

//中序線索化遍歷

void inorderthd()

cout << cur->_date <<

" ";

while (cur->_lefttag ==

thread)

cur = cur->_right;

}cout << endl;

}//前序線索化

void prevorderthreading()

//前序線索化遍歷

void prevorderthd()

cout << cur->_date <<

" ";

cur = cur->_right;

}cout << endl;

}//後序線索化

void postorderthreading()

protected:

//後序線索化

void _postorderthreading(node* cur, node*& prev)

if (prev && prev->_right ==

null)

prev = cur;

}//前序線索化

void _prevorderthreading(node* cur, node*& prev)

if (prev && prev->_right ==

null)

prev = cur;

if (cur->_lefttag ==

link)

if (cur->_righttag ==

link)

}//中序線索化

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

if (prev && prev->_right ==

null)

prev = cur;

_inorderthreading(cur->_right, prev); //右子樹

}node* _createtree(const t* a, size_t size, size_t& index, const t& invalid)

return newnode;

}protected:

node* _root;

};void test()

; int a2[15

]= ;

binarytreethreada(a1, 10, '#');

a.postorderthreading();

}int main()

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

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

線索化二叉樹

define crt secure no warnings 1 includeusing namespace std enum pointertag 列舉 其結構如下 void prevorderthreading 前序 void postorderthreading 後序 void inorder...

線索化二叉樹

includeusing namespace std includeenum pointertag template struct binarytreenode thd templateclass binarytree thd binarytree thd const t a,size t size...