二叉排序树基础代码与练习题

12 篇文章 0 订阅
4 篇文章 0 订阅
#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;
 }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值