#include#include #include #include using namespace std;struct TreeNode{ TreeNode* p; TreeNode* l; TreeNode* r; int key; TreeNode() { p = 0; l = 0; r = 0; key = -1; }};const int RANDMOD = 300;const int MAX = 10;TreeNode* root = new TreeNode;int tIndex = 0;int a[MAX];int getRandom(){ return rand() % RANDMOD;}/** * 中序遍历 */void inOrder(TreeNode* root){ if(root == NULL) return; inOrder(root->l); cout << root->key << " "; inOrder(root->r);}/** * 插入一个结点,等于在左子树 */void insertNode(int key){ if(root->key == -1) { root->key = key; return; } TreeNode* p = root; TreeNode* pc = 0; while (p != NULL) { pc = p; if(key <= p->key) p = p->l; else p = p->r; } TreeNode* newNode = new TreeNode; newNode->key = key; newNode->p = pc; if(key <= pc->key) pc->l = newNode; else pc->r = newNode;}/** * 查找root->key=key的结点 */TreeNode* findNode(TreeNode* root, int key){ if(root->key == key) return root; if(key <= root->key) return findNode(root->l, key); else return findNode(root->r, key); return 0;}/** * 查找以该结点为根的最小key的结点 */TreeNode* minNode(TreeNode* node){ while (node->l != NULL) node = node->l; return node;}/** * 查找以该结点为根的最大key的结点 */TreeNode* maxNode(TreeNode* node){ while (node->r != NULL) node = node->r; return node;}/** * z结点的后继结点 y * y.key > z.key && y2.key>y.key */TreeNode* afterNode(TreeNode* zNode){ if(zNode->r != NULL) return minNode(zNode->r); TreeNode* y = zNode->p; while (y != NULL && zNode == y->r) { zNode = y; y = y->p; } //不存在返回NULL return y;}/** *用v为根的结点替换u为根的子树 */void transplant(TreeNode* u, TreeNode* v){ //树根 if(u->p == NULL) root = v; else if(u == u->p->l) { u->p->l = v; } else u->p->r = v; if(v != NULL) v->p = u->p;}void deleteNode(TreeNode* zNode){ if(zNode->l == NULL) transplant(zNode, zNode->r); else if(zNode->r == NULL) transplant(zNode, zNode->l); else { TreeNode* y = minNode(zNode->r); if(y->p != zNode) { transplant(y, y->r); y->r = zNode->r; y->r->p = y; } transplant(zNode, y); y->l = zNode->l; y->l->p = y; }}int main(){ /** * 二叉搜索树,左子树的所有结点小于等于根结点,右子树的所有结点大于根节点 */ for(int i = 0; i < MAX; i++) { int k = getRandom(); a[i] = k; insertNode(k); } for(int i = 0; i < MAX; i++) cout << a[i] << " "; cout << endl; inOrder(root); cout << endl; cout << "最大值" << maxNode(root)->key << endl; cout << "最小值" << minNode(root)->key << endl; TreeNode* zNode = findNode(root, a[tIndex]); TreeNode* aNode = afterNode(zNode); if(aNode != NULL) cout << a[tIndex] << "的后继结点" << aNode->key << endl; else cout << a[tIndex] << "没有后继结点" << endl; //TODO删除一个结点 cout << "删除结点" << a[tIndex] << endl; deleteNode(zNode); inOrder(root); return 0;}
posted on 2017-06-02 22:26 阅读( ...) 评论( ...)