二叉樹是一種非線性結構,遍歷二叉樹幾乎都是通過遞歸或者用棧輔助實現非遞歸的遍歷。用二叉樹作為存儲結構時,取到一個節點,只能獲取節點的左孩子和右孩子,不能直接得到節點的任一遍歷序列的前驅或者后繼。
為了保存這種在遍歷中需要的信息,我們利用二叉樹中指向左右子樹的空指針來存放節點的前驅和后繼信息。
代碼結構如下:
enum PointerTag { THREAD, LINK }; template<class T> struct BinaryTreeNode { T _data; BinaryTreeNode<T>* _left; BinaryTreeNode<T>* _right; PointerTag _leftTag;//左孩子線索標志 PointerTag _rightTag;//右孩子線索標志 BinaryTreeNode(const T& d) :_data(d) , _left(NULL) , _right(NULL) { _leftTag = LINK; _rightTag = LINK; } };
代碼實現如下:
void InOrderThreading() //中序線索化 { Node* prev = NULL; _InOrderThreading(_root, prev); } void PrevOrderThreading() //前序線索化 { Node* prev = NULL; _PrevOrderThreading(_root, prev); } //void PostOrderThreading() //后序線索化 //{ // Node* prev = NULL; // _PostOrderThreading(_root, prev); //} void InOrderThd() //中序遍歷 { Node* cur = _root; while (cur) { while (cur->_leftTag == LINK) { cur = cur->_left; } cout << cur->_data << " "; while (cur->_rightTag == THREAD) { cur = cur->_right; cout << cur->_data << " "; } cur = cur->_right; } cout << endl; } void PrevOrderThd() //前序遍歷 { Node* cur = _root; while (cur) { cout << cur->_data << " "; while (cur->_leftTag == LINK) { cur = cur->_left; cout << cur->_data << " "; } cur = cur->_right; } cout << endl; } void _InOrderThreading(Node* root, Node*& prev) // { if (root == NULL) { return; } _InOrderThreading(root->_left, prev); if (root->_left == NULL) { root->_leftTag = THREAD; root->_left = prev; } if (prev&&(prev->_right == NULL)) { prev->_rightTag = THREAD; prev->_right = root; } prev = root; _InOrderThreading(root->_right, prev); } void _PrevOrderThreading(Node* root, Node*& prev) { Node* cur = root; if (cur == NULL) { return; } if (cur->_left == NULL) { cur->_leftTag = THREAD; cur->_left = prev; } if (prev&&prev->_right == NULL) { prev->_rightTag = THREAD; prev->_right = cur; } prev = cur; if (cur->_leftTag == LINK) { _PrevOrderThreading(cur->_left, prev); } if (cur->_rightTag == LINK) { _PrevOrderThreading(cur->_right, prev); } }
因為后序比較復雜,所以露珠不是很有能力寫出來。以后露珠會好好提高自己,然后把后序實現了哈哈哈哈
另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
網頁標題:二叉樹(二)---線索化二叉樹-創新互聯
文章來源:http://newbst.com/article24/dgieje.html
成都網站建設公司_創新互聯,為您提供移動網站建設、App設計、網站設計、商城網站、微信小程序、手機網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯