用c 實現二叉樹的線索化

2021-07-12 05:09:16 字數 3418 閱讀 5430

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

為了儲存這種在遍歷中需要的資訊,我們利用二叉樹中指向左

、右子樹的空指標來存放節點的前驅和後繼資訊。

實現源**:

#include

using namespace std;

enum pointertag//列舉型別

;//線索化二叉樹的結點結構

template < class t>

struct binarytreenodethd

};//線索化二叉樹類

template < class t>

class binarytreethd

//建構函式,arr為結點陣列,size為結點個數, index指向結點位置,invalid 非法值,如"#"

binarytreethd(const t* arr,size_t size,size_t index,const t& invalid)

//先序線索化

void prevorderthread()

//先序線索化遍歷二叉樹,訪問根結點->左子樹->右子樹

void _prevorderthreading()

while (cur)

cout << cur->_data<

//轉移到右邊的結點

cur = cur->_right;}}

//中序線索化

void inorderthread()

//中序線索化遍歷二叉樹,訪問左子樹->根結點->右子樹

void _invorderthreading()

while (cur)

cout << cur->_data << " ";//依次訪問左子樹->根結點

while (cur->_righttag == thread)

cur = cur->_right;}}

protected:

node* _createbinarytreethd(const t* arr, size_t size, size_t& index, const t& invalid)

return root;

}//先序線索化子樹

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

//置前線索化

if (cur->_left == null)

//置後線索化

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

prev = cur;

if (cur->_lefttag == link)

if (cur->_righttag == link)

}//中序線索化子樹

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

//遞迴遍歷左子樹

_inorderthread(cur->_left, prev);

if (cur->_left == null)

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

prev = cur;

//遞迴遍歷右子樹

_inorderthread(cur->_right, prev);

}private:

node* _root;

};void test()

;int arr2[15] = ;

binarytreethdtree1(arr1, 10, 0, '#');//二叉樹tree1

binarytreethdtree2(arr2, 15, 0, '#');//二叉樹tree2

cout << "列印二叉樹tree1:" << endl;

cout << "      " << arr1[0] << endl;

cout << "   " << arr1[1] << "      " << arr1[8] << endl;

cout << arr1[2] << "   " << arr1[5] << "   " << arr1[9] << endl;

cout << "列印二叉樹tree2:" << endl;

cout << "        " << arr2[0] << endl;

cout << "  " << arr2[1] << "            " << arr2[6] << endl;

cout << "     " << arr2[3] << "     " << arr2[7] << "      " << arr2[14]

cout << "                     " << arr2[11] << endl;

//注意一棵二叉樹一次只能線索化一次,如:先序線索之後,已經發生了線索標記,不能緊接著就進行中序線索化

cout << "先序線索化遍歷二叉樹tree1:   ";

tree1.prevorderthread();

tree1._prevorderthreading();

cout << endl;

cout << "先序線索化遍歷二叉樹tree2:   ";

tree2.prevorderthread();

tree2._prevorderthreading();

cout << endl;

/*cout << "中序線索化遍歷二叉樹tree1:   ";

tree1.inorderthread();

tree1._invorderthreading();

cout << endl;

cout << "中序線索化遍歷二叉樹tree2:   ";

tree2.inorderthread();

tree2._invorderthreading();

cout << endl;*/

}int main()

執行結果1:

列印二叉樹tree1:

2      5

3   4   6

列印二叉樹tree2:

2            4

3     5      8

先序線索化遍歷二叉樹tree1:   1 2 3 4 5 6

先序線索化遍歷二叉樹tree2:   1 2 3 4 5 6 7 8

請按任意鍵繼續. . .

執行結果2:

列印二叉樹tree1:

2      5

3   4   6

列印二叉樹tree2:

2            4

3     5      8

中序線索化遍歷二叉樹tree1:   3 2 4 1 6 5

中序線索化遍歷二叉樹tree2:   2 3 1 5 6 7 4 8

請按任意鍵繼續. . .

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

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

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

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

c 二叉樹的線索化

什麼是二叉樹的線索化?或者問什麼是線索二叉樹?按照某種遍歷方式對 二叉樹進行遍歷,可以把二叉樹中所有結點排序為乙個 線性序列 在改序列中,除第乙個結點外每個結點有且僅有乙個直接前驅結點 除最後乙個結點外每乙個結點有且僅有乙個直接後繼結點。這些指向直接前驅結點和指向直接後續結點的指標被稱為線索 thr...