#include<stdio.h>
#include<iostream>
#include<stdlib.h>
using namespace std;
//数据结构
typedef struct BSTnode
{
int data;
struct BSTnode* lchild;
struct BSTnode* rchild;
}*BSTree;
//非递归查找
BSTree BST_search(BSTree T,int key)
{
BSTree p = T;
if (p)
{
while (p && p->data != key)
{
if (p->data > key)
p = p->lchild;
else
p = p->rchild;
}
}
return p;
}
//插入 递归
int InsertBSTree(BSTree T,int key)
{
if (!T)
{
BSTree p = (BSTree)malloc(sizeof(BSTnode));
p->data = key;
p->lchild = NULL;
p->rchild = NULL;
return 1;
}
if (T->data == key)
return 0;
if (T->data < key)
return InsertBSTree(T->rchild, key);
else return InsertBSTree(T->lchild,key);
}
//题目:试编写一个算法,判断给定的二叉树是否是二叉排序树
//分析:若中序遍历是递增的则是
static int last = -32000;
int judge_if_BSTree(BSTree T)
{
int b1, b2;
if (!T)
return 1;
else
{
b1 = judge_if_BSTree(T->lchild);
if (b1 == 0 || T->data < last)
return 0;
last = T->data;
b2 = judge_if_BSTree(T->rchild);
return b2;
}
}
//题目:设计一个算法,求出给定结点在给定二叉排序树中的层次
int get_level_in_BSTree(BSTree T,int key)
{
BSTree p=T;
int level = 1;
if (p)
{
while (p)
{
if (p->data == key)
return level;
if (p->data > key)
p = p->lchild;
else
p = p->rchild;
level++;
}
}
return -1;
}
//题目:利用二叉树遍历的思想编写一个判断二叉树是否是平衡二叉树的算法
void judge_if_BT(BSTree T,int &balance,int &h)
{
int bl = 0, br = 0, h1 = 0, h2 = 0;
if (!T)
{
h = 0;
balance = 1;
}
else if (T->lchild == NULL && T->rchild == NULL)
{
h = 1;
balance = 1;
}
else
{
judge_if_BT(T->lchild,bl,h1);
judge_if_BT(T->rchild,br,h2);
h = (h1 > h2 ? h1 : h2);
if (abs(h1 - h2) < 2)
balance = bl && br;
else
{
balance = 0;
}
}
}
//题目:设计一个算法,求出给定二叉排序树中最小和最大的关键字
bool output_MAX_MIN_IN_BST(BSTree T, int max, int min)
{
BSTree p = T;
if (!T)
return false;
else
{
while (p->lchild)
{
p = p->lchild;
}
min = p->data;
while (p->rchild)
{
p = p->rchild;
}
max = p->data;
return true;
}
}
//题目:设计一个算法,从大到小输出二叉排序树中所有值不小于k的关键字
//思路:先遍历右子树在遍历左子树,因为排序树的中序遍历是从小到大,这个反过来中序遍历把右改左,把左改右,依次遍历,大于等于k的就输出,小于的就不执行输出
bool OUTPUT(BSTree T,int k)
{
if (!T)
return false;
else
{
OUTPUT(T->rchild,k);
if (T->data >= k)
cout << T->data;
OUTPUT(T->lchild,k);
return true;
}
}
二叉排序树基础代码与练习题
最新推荐文章于 2022-03-26 16:27:04 发布