二叉搜索树的插入和删除

二叉搜索树
(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;
		else
			return root;
	}
	p = new Tree();
	p->left = NULL;
	p->right = NULL;
	p->data = x;
	if(last->data < x)
		last->right = p;
	else
		last->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;
					else
						last->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;
					else
						last->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;
		}
		else
			cout << "not existed" << endl;
		print(root); cout << endl;
		cin >> value;
	}
	freeTree(root);
	cout << "tree freed" << endl;
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值