【算法题day1】二叉排序树

typedef struct BiTNode
{//二叉树链式存储结构
	ElemType data; //数据域
	struct BiTNode *lchild,*rchild; //左、右孩子指针
}BiTNode,*BiTree;

1. 判断给定的二叉树是否是二叉排序树【中序遍历】

int predt = -32767; //predt为全局变量,保存当前结点中序前驱的值
int JudgeBST(BiTree bt)
{//判断给定的二叉树是否是二叉排序树
	int b1, b2;
	if (bt == NULL)
		return 1; //空树,空树也是二叉排序树
	else
	{
		b1 = JudgeBST(bt->lChild); //判断左子树是否是二叉排序树
		if (b1 == 0 || predt >= bt->data) //若左子树范围值为0或前驱大于等于当前结点,则不是二叉排序树
			return 0;
		predt = bt->data; //保存当前结点的关键字
		b2 = JudgeBST(bt->rChild); //判断右子树
		return b2; //返回右子树的结果
	}
}

2.求出指定结点在给定二叉排序树中的层次

int level(BiTree bt, BSTNode* p)
{//本算法计算给定结点在二叉排序树中的层次
	int n = 0; //统计查找次数
	BiTree t = bt; //t为工作指针,遍历树去查找
	if (bt != NULL)
	{
		n++;
		while (t->data != p->data)
		{
			if (t->data > p->data) //在左子树中查找
				t = t->lChild;
			else				   //在右子树中查找
				t = t->rChild;
			n++;				   //层次加1
		}
		return n;
	}
}

3.判断二叉树是否是平衡二叉树【后序遍历】

void Judge_AVL(BiTree bt, int& balance, int& h)
{//本算法判断一个给定的二叉树是否为平衡二叉树
	int bl = 0, br = 0, hl = 0, hr = 0; //左右子树的平衡标记和高度
	if (bt == NULL) //空树,高度为0
	{
		h = 0;
		balance = 1;
	}
	else if (bt->lchild == NULL && bt->rchild == NULL) //仅有根节点,则高度为1
	{
		h = 1;
		balance = 1;
	}
	else
	{
		Judge_AVL(bt->lchild, bl, hl); //递归判断左子树
		Judge_AVL(bt->rchild, br, hr); //递归判断右子树
		h = (hl > hr ? hl : hr) + 1;
		if (abs(hl - hr) < 2) //若子树高度差的绝对值小于2,则看左右子树是否都平衡
			balance = bl & br; //左右子树都平衡时,二叉树平衡
		else
			balance = 0;
	}
}

4.求给定二叉排序树中最小和最大的关键字

int MinKey(BSTNode* bt)
{//求出二叉排序树中最小关键字结点
	while (bt->lchild != NULL)
		bt = bt->lchild;
	return bt->data;
}
int MaxKey(BSTNode* bt)
{//求出二叉排序树中最大关键字结点
	while (bt->rchild != NULL)
		bt = bt->rchild;
	return bt->data;
}

5.从大到小输出二叉排序树中所有值不小于k的关键字

void OutPut(BSTNode* bt, int k)
{//本算法从大到小输出二叉排序树中所有值不小于k的关键字(右-根-左)
	if (bt == NULL)
		return;
	if (bt->rchild != NULL)
		OutPut(bt->rchild, k); //递归输出右子树结点
	if (bt->data >= k)
		printf("%d", bt->data); //只输出大于等于k的结点值
	if (bt->lchild != NULL)
		OutPut(bt->lchild, k); //递归输出左子树的结点值
}

5.编写一个递归算法,在一颗有n个结点的、随机建立起来的二叉排序树上查找第k(1≤k≤n)小的元素,并返回指向该结点的指针。要求算法的平均时间复杂度为O(log2n)。二叉排序树的每个结点中除data、lchild、rchild等数据成员外,增加一个count成员,保存以该结点为根的子树上的结点数(包含根节点)

BSTNode* Search_Small(BSTNode* t, int k)
{//在以t为根的子树上寻找第k小的元素,返回其所在结点的指针。k从1开始计算
 //在树结点中增加一个count数据成员,存储以该结点为根的子树的结点个数
	if (k<1 || k>t->count)
		return NULL;
	if (t->lchild == NULL)
	{
		if (k == 1)
			return t;
		else
			return Search_Small(t->rchild, k - 1);
	}
	else
	{
		if (t->lchild->count == k - 1)
			return t;
		if (t->lchild->count > k - 1)
			return Search_Small(t->lchild, k);
		if (t->lchild->count < k - 1)
			return Search_Small(t->rchild, k - (t->lchild->count + 1));
	}
}

你可能感兴趣的:(数据结构GOGOGO)