算法导论二叉搜索树

来源:互联网 发布:手机淘宝排行榜 编辑:程序博客网 时间:2024/06/05 09:04
#include <iostream>#include <vector>#include<algorithm>using namespace std;vector<int> G;struct BTNode{int m_value;BTNode *m_left;BTNode *m_right;BTNode *parent;};//先序创建二叉树void CreatBTree(BTNode *&root) {int nValue;cin >> nValue;if (0 == nValue){return;}else{root = new BTNode();root->parent = NULL;root->m_value = nValue;CreatBTree(root->m_left);CreatBTree(root->m_right);}}void INORDER_TREE_WALK(BTNode *&pRoot) {if (pRoot != NULL) {INORDER_TREE_WALK(pRoot->m_left);cout << pRoot->m_value << " ";INORDER_TREE_WALK(pRoot->m_right);}}void Inorder_Parent(BTNode *&pRoot) {//将它们的父节点求出来if (pRoot != NULL) {Inorder_Parent(pRoot->m_left);if (pRoot->m_left != NULL) {pRoot->m_left->parent = pRoot;}if (pRoot->m_right != NULL) {pRoot->m_right->parent = pRoot;}Inorder_Parent(pRoot->m_right);}}BTNode *TREE_SEARCH(BTNode *&pRoot, int x) {//查询if (pRoot == NULL || x == pRoot->m_value) {return pRoot;}else {if (x < pRoot->m_value) {return TREE_SEARCH(pRoot->m_left, x);}else {return TREE_SEARCH(pRoot->m_right, x);}}}//插入BTNode *ITERATIVE_TREE_SEARCH(BTNode *pRoot, int x) {//递推法while (pRoot != NULL && x != pRoot->m_value) {if (x < pRoot->m_value) {pRoot = pRoot->m_left;}else {pRoot = pRoot->m_right;}}return pRoot;}void TREE_INSERT(BTNode *&pRoot, int v) {//递归BTNode *y = new BTNode();BTNode *z = new BTNode();z->m_value = v;z->m_left = NULL;z->m_right = NULL;z->parent = NULL;BTNode *x = pRoot;while (x != NULL) {y = x;//y始终是x的父节点if (v < x->m_value) {x = x->m_left;}else {x = x->m_right;}}z->parent = y;if (y == NULL) {//树为空pRoot = z;}else {if (v < y->m_value) {y->m_left = z;}else {y->m_right = z;}}}void TRANSPLANT(BTNode *&pRoot, BTNode *&u, BTNode *&v) {if (u->parent == NULL) {pRoot = v;}else {if (u == u->parent->m_left) {u->parent->m_left = v;}else {u->parent->m_right = v;}}if (v != NULL) {v->parent = u->parent;}}BTNode *TREE_MINIMUM(BTNode *&pRoot) {while (pRoot->m_left != NULL) {pRoot = pRoot->m_left;}return pRoot;}void TREE_DELETE(BTNode *&pRoot, int v) {BTNode *y = new BTNode();BTNode *z = ITERATIVE_TREE_SEARCH(pRoot, v);if (z->m_left == NULL) {TRANSPLANT(pRoot, z, z->m_right);}else {if (z->m_right == NULL) {TRANSPLANT(pRoot, z, z->m_left);}else {//z有左右两个子树y = TREE_MINIMUM(pRoot->m_right);if (y->parent != z) {TRANSPLANT(pRoot, y, y->m_right);y->m_right = z->m_right;y->m_right->parent = y;}TRANSPLANT(pRoot, z, y);y->m_left = z->m_left;y->m_left->parent = y;}}}int main() {BTNode *pRoot = NULL;CreatBTree(pRoot);Inorder_Parent(pRoot);int k, v;cin >> k;TREE_INSERT(pRoot, k);INORDER_TREE_WALK(pRoot);cout << endl;cin >> v;TREE_DELETE(pRoot, v);//BTNode *z = ITERATIVE_TREE_SEARCH(pRoot, v);//cout << z->m_left->m_value;INORDER_TREE_WALK(pRoot);cout << endl;system("pause");return 0;}

1 0