二叉排序树的查询、插入的递归和非递归代码

#include
#include
using namespace std;
typedef int datatype;
typedef struct BiNode
{
	datatype data;
	struct BiNode *lchild, *rchild;
}BiNode, *BiTree;
BiTree Search1(BiTree T, int key)  //递归查找BST中元素
{
	if (T == NULL)
		return T;    //找不到则返回空节点
    if (key < T->data)
		return Search1(T->lchild, key);
	else if (key > T->data)
		return Search1(T->rchild, key);
	else
		return T;    //找到则返回该节点
}
int Search2(BiTree T, int key, BiTree f,BiTree *P)  //非递归查找BST中元素
{
	/*需要保存被查找元素对应节点的父节点,在非递归的插入里面需要用到*/
	if (T == NULL)
	{
		*P = f;
		return false;
	}
	while (T != NULL)
	{
		*P = T;
		if (key == T->data)
			return true;
		if (key < T->data)
			T = T->lchild;		
		else if (key > T->data)
			T = T->rchild;
	}
	return false;
}
bool InsertBST1(BiTree *T, datatype key)  //递归插入二叉排序树
{
	/* 插入成功返回TRUE,否则返回FALSE */
	if (!(*T))   //不能用T == NULL判断,这是不准确的
	{
		*T = new BiNode;
		(*T)->data = key;
		(*T)->lchild = (*T)->rchild = NULL;
		return true;
	}
	if (key == (*T)->data)
		return false;
	else if (key < (*T)->data)
		return InsertBST1(&(*T)->lchild, key);
	else if (key > (*T)->data)
		return InsertBST1(&(*T)->rchild, key);
}
bool InsertBST2(BiTree *T, datatype key)  //非递归插入BST
{
	/* 插入key并返回TRUE,否则返回FALSE */
	BiTree S = new BiNode, P = NULL;   //P为父节点
	if (!Search2(*T, key, NULL, &P))   //没有当前元素时
	{//应该在P下面插入
		S->data = key;
		S->lchild = S->rchild = NULL;
		if (P == NULL)    //当前树为空树
			*T = S;
		else if (key < P->data)
			P->lchild = S;
		else if (key > P->data)
			P->rchild = S;
		return true;
	}
	return false;
}

void InOrder(BiTree T)
{
	if (T)
	{
		InOrder(T->lchild);
		cout << T->data << " ";
		InOrder(T->rchild);
	}
}
//删除就不写了,不会写删除。。。。反正删除之后用该元素的中序后继来替换
int main()
{
	int num, count = 0, a[15];
	BiTree T1=NULL, T2=NULL;
	ifstream cin("data.txt");
	while (cin >> num)
	{
		a[count++] = num;
		InsertBST1(&T1,num);
	}
	for (int i = 0; i < count; i++)
		InsertBST2(&T2, a[i]);
	cout << "递归插入中序输出:" << endl;
	InOrder(T1);
	cout << endl << "非递归插入中序输出:" << endl;
	InOrder(T2);
	cout << endl;
	system("pause");
	return 0;
}

二叉排序树的查询、插入的递归和非递归代码_第1张图片

你可能感兴趣的:(教程)