二叉樹是一種非線性結構,遍歷二叉樹幾乎都是通過遞歸或者用棧輔助實現非遞歸的遍歷。用二叉樹作為存儲結構時,取到一個節點,只能獲取節點的左孩子和右孩子,不能直接得到節點的任一遍歷序列的前驅或者后繼。為了保存這種在遍歷中需要的信息,我們利用二叉樹中指向左右子樹的空指針來存放節點的前驅和后繼信息。
10年的玉山網站建設經驗,針對設計、前端、開發、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。成都營銷網站建設的優勢是能夠根據用戶設備顯示端的尺寸不同,自動調整玉山建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現優雅布局與設計,從而大程度地提升瀏覽體驗。創新互聯建站從事“玉山網站設計”,“玉山網站推廣”以來,每個客戶項目都認真落實執行。




#include <iostream>
using namespace std;
enum PointerTag {THREAD, LINK};
template<class T>
struct BinaryTreeNodeThd
{
T _data; //數據
BinaryTreeNodeThd<T>* _left; //左孩子
BinaryTreeNodeThd<T>* _right; //右孩子
PointerTag _leftTag; //左孩子線索標志
PointerTag _rightTag; //右孩子線索標志
BinaryTreeNodeThd(const T& data)
:_data(data)
,_left(NULL)
,_right(NULL)
,_leftTag(LINK)
,_rightTag(LINK)
{}
};
template<class T>
class BinaryTreeThd
{
public:
BinaryTreeThd(const T* array, size_t size, const T& invalid)
{
size_t index = 0;
_root = _CreateTree(array, size, index, invalid);
}
~BinaryTreeThd()
{
_DestroyTree(_root);
_root = NULL;
}
void InOrderThreading()
{
BinaryTreeNodeThd<T>* prev = NULL;
_InOrderThreading(_root, prev);
}
void PreOrderThreading()
{
BinaryTreeNodeThd<T>* prev = NULL;
_PreOrderThreading(_root, prev);
}
void PostOrderThreading()
{
BinaryTreeNodeThd<T>* prev = NULL;
_PostOrderThreading(_root, prev);
}
void PreOrderThd()
{
BinaryTreeNodeThd<T>* cur = _root;
while (cur)
{
while (cur && LINK == cur->_leftTag)
{
cout<<cur->_data<<" ";
cur = cur->_left;
}
cout<<cur->_data<<" ";
cur = cur->_right;
}
cout<<endl;
}
void InOrderThd()
{
BinaryTreeNodeThd<T>* cur = _root;
while (cur)
{
while (cur && LINK == cur->_leftTag)
{
cur = cur->_left;
}
cout<<cur->_data<<" ";
while (THREAD == cur->_rightTag)
{
cur = cur->_right;
cout<<cur->_data<<" ";
}
cur = cur->_right;
}
cout<<endl;
}
protected:
BinaryTreeNodeThd<T>* _CreateTree(const T* array, size_t size, size_t& index, const T& invalid)
{
BinaryTreeNodeThd<T>* root = NULL;
if (index < size && array[index] != invalid)
{
root = new BinaryTreeNodeThd<T>(array[index]);
root->_left = _CreateTree(array, size, ++index, invalid);
root->_right = _CreateTree(array, size, ++index, invalid);
}
return root;
}
void _DestroyTree(BinaryTreeNodeThd<T>* root)
{
if (NULL == root)
return;
if (LINK == root->_leftTag)
_DestroyTree(root->_left);
if (LINK == root->_rightTag)
_DestroyTree(root->_right);
delete root;
}
void _PreOrderThreading(BinaryTreeNodeThd<T>* cur, BinaryTreeNodeThd<T>*& prev)
{
if (NULL == cur)
return;
if (NULL == cur->_left)
{
cur->_leftTag = THREAD;
cur->_left = prev;
}
if (prev && NULL == prev->_right)
{
prev->_rightTag = THREAD;
prev->_right = cur;
}
prev = cur;
if (cur->_leftTag == LINK)
_PreOrderThreading(cur->_left, prev);
if (cur->_rightTag == LINK)
_PreOrderThreading(cur->_right, prev);
}
void _InOrderThreading(BinaryTreeNodeThd<T>* cur, BinaryTreeNodeThd<T>*& prev)
{
if (NULL == cur)
return;
_InOrderThreading(cur->_left, prev);
if (NULL == cur->_left)
{
cur->_leftTag = THREAD;
cur->_left = prev;
}
if (prev && NULL == prev->_right)
{
prev->_rightTag = THREAD;
prev->_right = cur;
}
prev = cur;
_InOrderThreading(cur->_right, prev);
}
void _PostOrderThreading(BinaryTreeNodeThd<T>* cur, BinaryTreeNodeThd<T>*& prev)
{
if (NULL == cur)
return;
_PostOrderThreading(cur->_left, prev);
_PostOrderThreading(cur->_right, prev);
if (cur->_left == NULL)
{
cur->_leftTag = THREAD;
cur->_left = prev;
}
if (prev && NULL == prev->_right)
{
prev->_rightTag = THREAD;
prev->_right = cur;
}
prev = cur;
}
protected:
BinaryTreeNodeThd<T>* _root;
};
void Test()
{
int a[] = {1, 2, 3, '#', '#', 4, '#', '#', 5, 6};
BinaryTreeThd<int> t1(a, sizeof(a)/sizeof(a[0]), '#');
t1.PreOrderThreading();
t1.PreOrderThd();
BinaryTreeThd<int> t2(a, sizeof(a)/sizeof(a[0]), '#');
t2.InOrderThreading();
t2.InOrderThd();
int a1[] = {1, 2, '#', 3, '#', '#', 4, 5, '#', 6, '#', 7, '#', '#', 8};
BinaryTreeThd<int> t3(a1, sizeof(a1)/sizeof(a1[0]), '#');
t3.PreOrderThreading();
t3.PreOrderThd();
}
int main()
{
Test();
return 0;
}
分享標題:C++線索化二叉樹
本文鏈接:http://www.yijiale78.com/article30/ghdiso.html
成都網站建設公司_創新互聯,為您提供網站設計、云服務器、靜態網站、網頁設計公司、做網站、服務器托管
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯