二叉搜尋樹(二叉穿線樹)抽象結構以及線索化演算法
阿新 • • 發佈:2019-02-05
//二叉線索樹 //每個節點儲存了它在某種遍歷順序下的前驅和後繼節點的位置,所以Node類中需要新增 //preLink和nextLink兩個指標,但是在中序遍歷下,可以把未被利用的n+1個指標域用 //上來存下一訪問節點的位置,但是需要增加leftTag和rightTag兩個標記量區分是指向 //孩子還是指向遍歷的前驅和後繼 //Node類的資料型別 class ThreadNode{ public: bool leftTag; bool rightTag; ThreadNode* lLink; ThreadNode* rLink; int item; public: ThreadNode() = default; ThreadNode(int a); }; ThreadNode::ThreadNode(int a) {item = a; leftTag = rightTag = 0; lLink = rLink = nullptr;} //ThreadBinaryTree類 //這裡構造方法和普通二叉樹一樣,直接一點一點連就好了 class ThreadBinaryTree{ public: ThreadNode root; public: ThreadBinaryTree() = default; ThreadBinaryTree(ThreadNode*); void InOrder(ThreadNode * _root); void InThread(ThreadNode *_root, ThreadNode* & pre);//線索化中序二叉樹 }; //線索化二叉樹 void ThreadBinaryTree::InThread(ThreadNode * _root,ThreadNode* & pre)//pre在函式遞迴呼叫的時候要保持 { if(_root!= nullptr) { InThread(_root->lLink, pre); if(_root->lLink == nullptr) { _root->lLink = pre; _root->leftTag = 1; } if(pre && pre->rLink == nullptr) { pre->lLink = _root; pre->rightTag = 1; } pre = _root; InThread(_root->rLink, pre); } }