二叉搜索树
#include<iostream> using namespace std; class binaryNode{ public: binaryNode(int &a):key(a),p(NULL),Left(NULL),Right(NULL){ } binaryNode* p; binaryNode* Left; binaryNode* Right; int key; }; //二叉树插入 void tree_insert(binaryNode** T, int t) { binaryNode* p = new binaryNode(t); // cout << p->key; //return; binaryNode* root = *T; if(root == NULL) { *T = p; p->p = NULL; } else { binaryNode* temp = root; binaryNode* y; while(temp != NULL) { y = temp; if(temp->key < p->key) { temp = temp->Right; } else { temp = temp->Left; } } if(y->key < p->key) { y->Right = p; p->p = y; } else { y->Left = p; p->p = y; } } } //二叉树中序遍历 void tree_inorde(binaryNode** T) { binaryNode* root = *T; if(root == NULL) { return; } else { if(root->Left != NULL) tree_inorde(&root->Left); cout << root->key << " "; if(root->Right != NULL) tree_inorde(&root->Right); } } //二叉树最大值 binaryNode* tree_max(binaryNode **T) { binaryNode* root = *T; binaryNode* y; while(root != NULL) { y = root; root = root->Right; } return y; } //二叉树最小值 binaryNode* tree_min(binaryNode **T) { binaryNode* root = *T; binaryNode* y; while(root != NULL) { y = root; root = root->Left; } return y; } //前驱 binaryNode* tree_pre(binaryNode **T) { binaryNode* root = *T; if(root->Left != NULL) { return tree_max(&root->Left); } else { cout << "jianlai"; if(root->p->Left == root) { cout << "最小点,无前驱" << endl; return root; } binaryNode *y = root->p; while(y->Left == root && y != NULL) { cout << "YYY " << root->key << " YYY "; root = y; y = root->p; } return y; } } //后继 binaryNode* tree_successor(binaryNode **T) { binaryNode* root = *T; if(root->Right != NULL) { return tree_max(&root->Right); } else { if(root->p->Right == root) { cout << "最大点,无后继" << endl; return root; } while(root->p->Right != root && root->p != NULL) { root = root->p; } return root->p; } } //查找 binaryNode* tree_search(binaryNode** T, int k) { binaryNode* root = *T; if(root == NULL) { cout << "没有找到" << endl; } else { if(root->key == k) { return root; } else if(root->key < k) { return tree_search(&root->Right,k); } else { return tree_search(&root->Left,k); } } } //用一棵子树替换另一课子树,为删除节点服务 void transplant(binaryNode** T,binaryNode* u, binaryNode* v) { binaryNode* root = *T; if(root->p == NULL) { T = &v; } else { if(u->p->Left == u) { u->p->Left = v; } else { u->p->Right = v; } if(v != NULL) { v->p = u->p; } } } //删除 void tree_delete(binaryNode** T, binaryNode* z) { if(z->Left == NULL) { transplant(T,z,z->Left); } else if(z->Right == NULL) { transplant(T,z,z->Right); } else { binaryNode* y = tree_min(&z->Right); //右子树不是y if(z->Right != y) { transplant(T,y,y->Right); y->Right = z->Right; y->Right->p = y; } transplant(T,z,y); y->Left = z->Left; y->Left->p = y; } } int main() { //return 0; binaryNode **T; binaryNode *root = NULL; T = &root; // 此处必须这样写,不能写作 *T = NULL;因为T根本好还没分配地址呢 //return 0; int a[10] = {12,456,22,355,22,11,55,666,22,33}; for(int i= 0;i!=10;++i ) { tree_insert(T,a[i]); } tree_inorde(T); cout << (*T)->key << endl; cout << (*T)->Left->key << endl; cout << (*T)->Right->key << endl; cout << endl; cout << tree_max(T)->key << endl; cout << endl; binaryNode* p = tree_search(T,666); cout << tree_pre(&p)->key; cout << p->key << " " << 333 << endl; tree_search(T,1000); return 0; }