二叉搜索树的插入和删除

来源:互联网 发布:mac 实用软件下载 编辑:程序博客网 时间:2024/06/06 01:14
二叉搜索树
(1)左子树上的所有节点的关键码小于根节点的关键码
(2)右子树上的所有节点的关键码大于根节点的关键码
(3)左子树和右子树也是二叉搜索码
插入:直接搜索并插入
删除
(1)删除叶节点,只需将其父节点指向他的指针清空。
(2)左右子树有一个为空,则拿子节点来顶替父节点的位置,再释放它。

(3)左右子树不为空,在其右子树下寻找中序下的第一个节点,用它的值填补到被删节点中,然后处理该节点的删除问题。该节点删除问题转化为前两个情况,因此可以递归的进行处理。


/*************************************************************************    > File Name: BinarySearchTree.cpp    > Author: ltf    > Mail: @qq.com     > Created Time: Sun 27 Mar 2016 08:56:06 PM CST ************************************************************************/#include<iostream>using namespace std;typedef struct Tree{Tree *left;Tree *right;int data;}*pTree;//插入元素,生成二叉搜索树Tree* insertElement(int x,Tree *root){if(root == NULL){root = new Tree(); root->data = x;root->left = NULL;root->right = NULL;return root;}Tree *p = root;Tree *last = p;while(p != NULL){last = p;if(p->data > x)p = p->left;else if(p->data < x)p = p->right;elsereturn root;}p = new Tree();p->left = NULL;p->right = NULL;p->data = x;if(last->data < x)last->right = p;elselast->left = p;return root;}// 非递归删除元素bool deleteElementNonRecursive(int x,Tree *&root){Tree *p = root;Tree *last = p;bool direct = false;while(p != NULL){if(p->data < x){last = p;p = p->right;direct = true;}else if(p->data > x){last = p;direct = false;p = p->left;}else{if(p->left == NULL){if(p == root)root = root->right;else{if(direct)last->right = p->right;elselast->left = p->right;}delete p;return true;}else if(p->right == NULL){if(p == root)root = root->left;else{if(direct)last->right = p->left;elselast->left = p->right;}delete p;return true;}else{Tree *temp = p->right;while(temp->left != NULL)temp = temp->left;swap(temp->data,p->data);last = p;p = p->right;direct = true;}}}return false;}// 递归删除元素,比较简单,注意传递的是引用指针bool deleteElement(int x, Tree *&p){if(p->data < x)return deleteElement(x,p->right);else if(p->data > x)return deleteElement(x,p->left);else{Tree *temp = p;if(p->left == NULL){p = p->right;delete temp;return true;}else if(p->right == NULL){p = p->left;  // 这儿直接会修改原来的指针delete temp;return true;}else{Tree *q;q = p->right;while(q->left != NULL) q = q->left;swap(p->data,q->data); return deleteElement(x,p->right);}}}void print(Tree *tree){if(tree != NULL){print(tree->left);cout << tree->data;print(tree->right);}}// 释放树节点void freeTree(Tree *tree){if(tree != NULL){freeTree(tree->left);freeTree(tree->right);delete tree;}}int main(){int value;Tree *root = NULL;cout << "input the node" << endl;cin >> value;while(value != 0){root = insertElement(value ,root);cin >> value;}print(root); cout << endl;cout << "input the num to delete" << endl;cin >> value;while(value != 0){//if(deleteElementNonRecursive(value,root))if(deleteElement(x,root)){cout << "succeed" << endl;}elsecout << "not existed" << endl;print(root); cout << endl;cin >> value;}freeTree(root);cout << "tree freed" << endl;return 0;}

0 0
原创粉丝点击