二叉查找树的基本操作

#include <iostream>
using namespace std;

#define MAXSIZE 8


class Node {
public:
	Node(int key) {
		m_key = key;
		init();
	}

	void init()
	{
		m_left = NULL;
		m_right = NULL;
		m_p = NULL;
	}

	~Node() {}

public:
	int m_key;
	Node* m_left;
	Node* m_right;
	Node* m_p;
};


void InsertNode(Node** T, int k)
{
//	t -> point of currenty node; y ->point of parent of t
	Node** t = T;
	Node* y = NULL;
	while (*t) {
		if ((*t)->m_key >= k) {
			y = *t;
			t = &((*t)->m_left);
		}
		else if ((*t)->m_key < k) {
			y = *t;
			t = &((*t)->m_right);
		}
	}
	*t = new Node(k);
	(*t)->m_p = y;
}

void DestoryTree(Node** T)
{
	if (*T) {
		DestoryTree(&(*T)->m_left);
		DestoryTree(&(*T)->m_right);
		delete *T;
		*T = NULL;
	}
}

Node* BuildTree(int* A, int size)
{
	if (size <= 0) return NULL;
	Node* root = NULL;
	for (int i = 0; i < size; ++i)
	{
		InsertNode(&root, A[i]);
	}
	return root;
}

void InorderTreeWalk(Node* T)
{
	if (T) {
		InorderTreeWalk(T->m_left);
		cout << T->m_key << " ";
		InorderTreeWalk(T->m_right);
	}
}

void PostorderTreeWalk(Node* T)
{
	if (T) {
		InorderTreeWalk(T->m_right);
		InorderTreeWalk(T->m_left);
		cout << T->m_key << " ";
	}
}

Node* TreeSearch(Node* T, int k)
{
	if (!T || k == T->m_key) 
		return T;
	else if (k < T->m_key) 
		return TreeSearch(T->m_left, k);
	else 
		return TreeSearch(T->m_right, k);
}

Node* InteractiveTreeSearch(Node* T, int k)
{
	while (T && k != T->m_key) {
		if (k < T->m_key)
			T = T->m_left;
		else
			T = T->m_right;
	}
	return T;
}

Node* Maximum(Node* T)
{
	if (!T) return NULL;
	while (T->m_right) {
		T = T->m_right;
	}
	return T;
}

Node* Minimum(Node* T)
{
	if (!T) return NULL;
	while (T->m_left) {
		T = T->m_left;
	}
	return T;
}

Node* TreeSuccessor(Node* T)
{
	if (!T) return NULL;
	if(T->m_right) {
		return Minimum(T->m_right);
	}
	Node* x = T;
	Node* y = T->m_p;
	if (y && x == y->m_right) {
		x = y;
		y = y->m_p;
	}
	return y;
}

Node* TreePresuccessor(Node* T)
{
	if (!T) return NULL;
	if (T->m_left) {
		return Maximum(T->m_left);
	}
	Node* x = T;
	Node* y = T->m_p;
	if (y && x == y->m_left) {
		x = y;
		y = y->m_p;
	}
	return y;
}

Node* TreeInsert(Node* root, Node* z)
{
	Node* x = root;
	Node* y = NULL;
	while (x) {
		y = x;
		if (z->m_key > x->m_key) {
			x = x->m_right;
		}
		else
			x = x->m_left;
	}
	z->m_p = y;
	if (y == NULL) {
		// empty tree
		root = z;
	}
	else {
		if (z->m_key < y->m_key) {
			y->m_left = z;
		}
		else
			y->m_right = z;
	}
	return root;
}

Node* TreeDelete(Node* T, Node* z)
{
	Node* y;
	Node* x;
	if (!z->m_left || !z->m_right) {
		y = z;
	}
	else
		y = TreeSuccessor(z);

	if (y->m_left)
		x = y->m_left;
	else
		x = y->m_right;

	if (x)
		x->m_p = y->m_p;

	if (!y->m_p) {
		if (x) x->m_p = NULL;
		return x;
	}
	else {
		if (y == y->m_p->m_left) {
			y->m_p->m_left = x;
		}
		else
			y->m_p->m_right = x;
	}
	if (y != z) {
		z->m_key = y->m_key;
	}
	return T;
}

int main()
{
	Node* root = NULL;
	int a[MAXSIZE] = { 12,5,18,2,9,15,19,17};
	root = BuildTree(a, MAXSIZE);
	InorderTreeWalk(root);
	cout << endl;

	Node* max = Maximum(root);
	if (max)
		cout << "Max:"<< max->m_key << endl;

	Node* min = Minimum(root);
	if (min)
		cout << "Min:"<< min->m_key << endl;

	Node* succ = TreeSuccessor(root->m_left->m_right->m_right);
	if (succ) cout << succ->m_key << endl;
	Node* presucc = TreePresuccessor(root->m_left->m_right->m_right);
	if (presucc) cout << presucc->m_key << endl;

	Node* z = new Node(7);
	root = TreeInsert(root, z);
	InorderTreeWalk(root);
	cout << endl;

	Node* zz = root->m_right->m_left;
	root = TreeDelete(root, zz);
	InorderTreeWalk(root);
	cout << endl;
	DestoryTree(&root);
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值