二叉樹是一種非線性結構,遍歷二叉樹幾乎都是通過遞迴或者用棧輔助實現非遞迴的遍歷。用二叉樹作為儲存結構時,取到乙個節點,只能獲取節點的左孩子和右孩子,不能直接得到節點的任一遍歷序列的前驅或者後繼。
為了儲存這種在遍歷中需要的資訊,我們利用二叉樹中指向左
、右子樹的空指標來存放節點的前驅和後繼資訊。
實現源**:
#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...