二叉搜索树(C++)

原创 2015年07月09日 11:18:12
#include <iostream>

using namespace std;

typedef struct BiTNode{
	int data;
	struct BiTNode *lchild, *rchild;
}BiTNode,*BiTree;

class solution{
public:
	bool searchBst(BiTree root, int key, BiTree f, BiTree *p)
	{
		if (!root)
		{
			*p = f;
			return false;
		}
		else if (root->data == key)
		{
			*p = root;
			return true;
		}
		else if (key < root->data)
		{
			searchBst(root->lchild, key, root, p);
		}
		else
		{
			searchBst(root->rchild, key, root, p);
		}
	}

	bool insertNode(BiTree *root,int key)
	{
		BiTree p;
		if (!searchBst(*root, key, NULL, &p))
		{
			BiTNode* s = new BiTNode;
			s->data = key;
			s->lchild = s->rchild = NULL;
			if (!p)
			{
				*root = s;
			}
			else if (key < p->data)
			{
				p->lchild = s;
			}
			else
			{
				p->rchild = s;
			}

			return true;
		}
		else
		{
			return false;
		}
	}
	
	void printTree(BiTree root)
	{
		if (root == NULL)
			return;
		printTree(root->lchild);
		cout << root->data << "  ";
		printTree(root->rchild);
	}

	BiTNode* maxValue(BiTree root)
	{
		if (!root)
			return NULL;
		BiTNode* s = root;
		while (s->rchild)
		{
			s = s->rchild;
		}
		return s;
	}

	BiTNode* minValue(BiTree root)
	{
		if (!root)
			return NULL;
		BiTNode* s = root;
		while (s->lchild)
		{
			s = s->lchild;
		}
		return s;
	}

	bool Delete(BiTree* p)
	{
		BiTree q,s;	
		if ((*p)->lchild == NULL)
		{
			BiTree q = *p;
			*p = (*p)->rchild;
			delete q;
		}
		else if ((*p)->rchild == NULL)
		{
			BiTree q = *p;
			*p = (*p)->lchild;
			delete q;
		}
		else
		{
			s = (*p)->lchild;
			q = *p;
			while (s->rchild)
			{
				q = s;
				s = s->rchild;
			}
			(*p)->data = s->data;
			if (*p == q)
			{
				q->lchild = s->lchild;
			}
			else
			{
				q->rchild = s->lchild;
			}
			delete s;
		}
		return true;	
	}

	bool DeleteBST(BiTree* root, int key)
	{
		if (!root && !(*root))
			return false;
		else
		{
			if (key == (*root)->data)
				Delete(root);
			else if (key < (*root)->data)
				return DeleteBST(&((*root)->lchild), key);
			else
				return DeleteBST(&((*root)->rchild), key);
		}		
	}
};

int main()
{
	solution s;
	BiTree root=NULL;
	int a[10] = { 6, 4, 8, 5, 0, 9, 3, 7, 1, 2 };
	for (int i = 0; i < 10; ++i)
	{
		s.insertNode(&root, a[i]);
	}

	cout << "前序遍历结果:" << endl;
	s.printTree(root);
	cout << endl;
	cout << "最大值:" << endl;
	cout << (s.maxValue(root))->data << endl;
	cout << "最小值:" << endl;
	cout << (s.minValue(root))->data << endl;
	cout << "查找值为'3'的结点:" << endl;
	BiTree p;
	cout << (s.searchBst(root, 3, NULL, &p) ? "exist" : "no exist" )<< endl;
	cout << (s.searchBst(root, 8, NULL, &p) ? "exist" : "no exist") << endl;
	cout << (s.searchBst(root, 13, NULL, &p) ? "exist" : "no exist") << endl;
	cout << "删除值为3的结点:" << endl;
	s.DeleteBST(&root, 3);
	s.printTree(root);
	cout << endl;

	return 0;
}

二叉搜索树(C#,C++)

  • 2017年10月11日 10:45
  • 3.58MB
  • 下载

二叉搜索树的非递归C++实现

师兄的,学习了:http://my.oschina.net/zmjerry/blog/6041 头文件: /************************************...

二叉搜索树的C++源代码

  • 2009年08月28日 22:40
  • 5KB
  • 下载

VC/C++实现二叉搜索树查找算法

  • 2010年12月21日 16:33
  • 468KB
  • 下载

<C/C++数据结构>二叉搜索树

一,二叉树的定义: 二叉树在图论中是这样定义的:二叉树是一个连通的无环图,并且每一个顶点的度不大于3。有根二叉树还要满足根结点的度不大于2。有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结...

二叉搜索树C++代码

  • 2016年07月30日 19:33
  • 2.22MB
  • 下载

二叉搜索树的c++实现

  • 2014年07月05日 16:38
  • 9KB
  • 下载

二叉搜索树 -【动态规划】最优C++实现

程序在VC++6.0下编译通过 1 #include iostream> 2 #include fstream> 3 #include string> 4 #include li...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉搜索树(C++)
举报原因:
原因补充:

(最多只允许输入30个字)