二叉树(线索化)
二叉树的线索化:
二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历。用二叉树作为存储结构时,取到一个节点,只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继。
为了保存这种在遍历中需要的信息,我们利用二叉树中指向左右子树的空指针来存放节点的前驱和后继信息.
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; }
线索化呢,就介绍到这里,如果你还有什么要补充或更好的想法的欢迎参与评论,请不吝赐教哦~~