線索化意義:
二叉樹是非線性結構,遍歷二叉樹都是通過遞迴或者用棧輔助非遞迴來遍歷的。如果我們知道乙個節點的前驅和後繼,那麼我們就可直接遍歷二叉樹
設定二叉樹節點的前驅和後繼,就是線索化二叉樹,我們利用指向左右子樹的空指標存放節點的前驅和後繼
線索化設計思路:
遍歷二叉樹,當遍歷到乙個節點的左節點或右節點為空時,設定它的前驅和後繼,那麼訪問時直接可根據節點的前驅和後繼來進行訪問
**:
#pragma once
#include#includeusing namespace std;
enum pointertag;
templatestruct binarytreenode_thd
t _data;
binarytreenode_thd* _left;//左孩子
binarytreenode_thd* _right;//右孩子
pointertag _lefttag;//左孩子線索化標誌
pointertag _righttag;//右孩子線索化標誌
};templateclass binarytreethd
void inordertheading()//中序線索化
void inorderthd()//中序遍歷
cout << cur->_data << " ";
while (cur->_righttag == thread)
cur = cur->_right;
} cout << endl;
} void prevordertheading()//前序線索化
void prevorderthd()//前序遍歷
cout << cur->_data << " ";
cur = cur->_right;
} }void postordertheading()//後序線索化
protected:
node* _creattree(const t *a, size_t size, size_t &index, const t& invalid)//建立二叉樹
return node;
} void _inordertheading(node *cur, node* &prev)//遞迴方法中序線索化
if (prev && prev->_right == null)//線索化後繼,這裡由於本次線索化時並不知道其後繼是**,
//因此後繼通過線索化下各節點的前驅時進行線索化
prev = cur;
_inordertheading(cur->_right, prev);
} void _prevordertheading(node *cur, node* &prev)//遞迴方法前序線索化
if (prev && prev->_right == null)
prev = cur;
if (cur->_lefttag==link)
_prevordertheading(cur->_left, prev);
if (cur->_righttag==link)
_prevordertheading(cur->_right, prev);
} void _postordertheading(node *cur, node* &prev)//遞迴方法中序線索化
if (prev && prev->_right == null)
prev = cur;
}private:
node* _root;
};
(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...
線索化二叉樹
define crt secure no warnings 1 includeusing namespace std enum pointertag 列舉 其結構如下 void prevorderthreading 前序 void postorderthreading 後序 void inorder...