二叉樹的線索化:
二叉樹是一種非線性結構,遍歷二叉樹幾乎都是通過遞歸或者用棧輔助實現非遞歸的遍歷。用二叉樹作為存儲結構時,取到一個節點,只能獲取節點的左孩子和右孩子,不能直接得到節點的任一遍歷序列的前驅或者后繼。
為了保存這種在遍歷中需要的信息,我們利用二叉樹中指向左右子樹的空指針來存放節點的前驅和后繼信息.
n個結點的二叉鏈表中含有n+1個空指針域。利用二叉鏈表中的空指針域,存放指向結點在某種遍歷次序下的前趨和后繼結點的指針(這種附加的指針稱為"線索")。
這種加上了線索的二叉鏈表稱為線索鏈表,相應的二叉樹稱為線索二叉樹(Threaded BinaryTree)。根據線索性質的不同,線索二叉樹可分為前序線索二叉樹、中序線索二叉樹和后序線索二叉樹三種(這里呢只介紹前兩種)。
/*這里是線索化二叉樹的結構*/
enum Flag { LINK, //一般指針的標記 CLUE //線索化指針的標記 }; template<class T> struct Clue_Node //線索化二叉樹的節點的結構 { Clue_Node(const T& value) :_value(value), _left(NULL), _right(NULL), _left_flag(LINK), _right_flag(LINK) {} T _value; Clue_Node *_left; Clue_Node *_right; Flag _left_flag; Flag _right_flag; };
/*前序線索的構建*/ template<class T> void Clue_Binary_Tree<T>::_Prev_Creat(Clue_Node<T> * root, Clue_Node<T> *& prev) { if (root) { if (root->_left == NULL) { root->_left_flag = CLUE; root->_left = prev; } if (prev && prev->_right == NULL) { prev->_right_flag = CLUE; prev->_right = root; } prev = root; if (!root->_left_flag) { _Prev_Creat(root->_left, prev); } _Prev_Creat(root->_right, prev); } }
/*前序線索下的遍歷*/ template<class T> void Clue_Binary_Tree<T>::_Prev_Order(Clue_Node<T> * root) { cout << "在前序線索下的遍歷:" << endl; while (root) { while (root->_left_flag != CLUE) { cout << root->_value << " "; root = root->_left; } cout << root->_value << " "; root = root->_right; } cout << endl; }
/*中序線索的構建*/ template<class T> void Clue_Binary_Tree<T>::_In_Creat(Clue_Node<T> * root, Clue_Node<T> *& prev) { if (root) { _In_Creat(root->_left, prev); //左子樹 if (root->_left == NULL) { root->_left_flag = CLUE; root->_left = prev; } if (prev && prev->_right == NULL) { prev->_right_flag = CLUE; prev->_right = root; } prev = root; _In_Creat(root->_right, prev); //右子樹 } }
/*中序線索下的遍歷*/ template<class T> void Clue_Binary_Tree<T>::_In_Order(Clue_Node<T> * root) { cout << "中序遍歷:" << endl; while (root) { while (root->_left_flag != CLUE) { root = root->_left; } cout << root->_value << " "; while (root->_right_flag != LINK) { root = root->_right; cout << root->_value << " "; } root = root->_right; } cout << endl; }
線索化呢,就介紹到這里,如果你還有什么要補充或更好的想法的歡迎參與評論,請不吝賜教哦~~