6.判断给定的二叉树是否是二叉排序树

算法思想:中序遍历,一棵树为二叉排序树即左右子树为二叉排序树,且当前根节点和左右子树呈递增序列,对左右子树也是如此判断,显然是个递归过程                          

BiTree pre = NULL;//指向当前遍历节点的前驱节点
bool is_BST_InOrder(BiTree root){if(!root){//空树当作二叉排序树return true;}bool lchild = is_BST_InOrder(root->left);//判断左子树if(pre){//比较当前根节点是否比左子树上的节点都大,比右子树上的节点都小if(pre->val > root->val){return false;   }else{pre = root;}}else{pre = root;}bool rchild =  is_BST_InOrder(root->right);//判断右子树return lchild && rchild;
}

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

算法思想:每向下查找该节点一次,该节点的层次加1

int NodeLevel(BiTree root,BiTree target){int levelNumber = 0;if(root){//设根节点的层次为1levelNumber++;//有根先加1while(root->val != target->val){if(root->val < target->val){        root = root->left;                }else{root = root->right;                       }     levelNumber++;     }}return levelNumber;
}

8.判断二叉树是否为二叉平衡树

算法思想:一棵树为二叉平衡树,即左右子树为平衡二叉树且左右子树高度之差的绝对值小于2

int hight(BiTree root){if(!root){//空树高度为0return 0;}int leftHight = hight(root->left);//既是左子树的高度,又是左子树的平衡标记int rightHight = hight(root->right);//既是右子树的高度,又是右子树的平衡标记//判断是否是AVL//若左子树或右子树不平衡,或左右子树高度之差大于1,则该树不平衡,返回-1表示不平衡if(leftHight == -1 || rightHight == -1 || fabs(leftHight-rightHight) > 1){return -1;}else{//若该树平衡,向上层根节点返回该树的高度:为左右子树高度最大者加1return (leftHight > rightHight ? leftHight : rightHight)+1;}
}bool isAVL(BiTree root){//空树认为是AVL,不是空树:为AVL则高度必大于0,不是AVL,高度为-1return hight(root) >= 0;}

9.求出二叉排序树中最小和最大的关键字

算法思想:BST的中序遍历是递增序列,其最小和最大关键字为中序序列的第一个节点和最后一个节点,则在BST中,最小节点就是最左下节点,最大节点就是最右下节点(中序遍历的特点)

ElemType BST_MaxValue(BiTree root){while(root->left){root = root->left;}return root->val;}ElemType BST_MinValue(BiTree root){while(root->right){root = root->right;}return root->val;}

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

算法思想:一般的中序遍历是先左后根再右,由于查找大于等于k的关键字,本题可采取先右后根再左的中序遍历

void revese_InOrder(BiTree root,ElemType k){if(root){revese_InOrder(root->right,k);if(root->val >= k){printf(root->val);}revese_InOrder(root->left,k);}
}

11.编写递归算法求有n个结点,随机建立起来的二叉排序树上查找第k(1<=k<=n)小的元素,并返回该结点的指针,要求时间复杂度为O(log2n),每个结点内增加一个count成员,保存以该结点为根的子树上的结点个数

算法思想:该算法的作用是找BST上第k小的元素,有五种情况

(1)左子树为空

①若k=1,则根节点为第k小

②若k>1,则第k小在根节点的右子树上

(2)左子树不为空

③左子树上有k-1个节点,则当前根节点就是第k小

②左子树上小于k-1个节点,则第k小的元素,在当前根节点的右子树上

③左子树上大于k-1个节点,则第k小的元素,在当前根节点的左子树上

BiTree Search_kmin(BiTree root,int k){if(!root || k < 1){//空树或k值违法return NULL;}if(root->left == NULL){if(k==1){return root;}else{return Search_kmin(root->right,k-1);//在右子树上查找第k-1小节点}}else{if(root->left->count == k-1){return root;}else if(root->left->count > k-1){return Search_kmin(root->left,k);//在左子树上查找第k小节点}else{//在右子树上查找第k-根-左子树上节点数小节点return Search_kmin(root->right,k-1-(root->left->count));}
}

23王道数据结构二叉搜索树(BST)算法题(6-11题)总结(伪代码)相关推荐

  1. 数据结构 二叉搜索树BST的实现与应用

    概念 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 1.若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值 ...

  2. 【数据结构与算法】3.二叉搜索树(BST)、c++代码

    二叉搜索树(BST).c++代码 参考 https://blog.csdn.net/c_living/article/details/81021510

  3. 看动画学算法之:二叉搜索树BST

    文章目录 简介 BST的基本性质 BST的构建 BST的搜索 BST的插入 BST的删除 看动画学算法之:二叉搜索树BST 简介 树是类似于链表的数据结构,和链表的线性结构不同的是,树是具有层次结构的 ...

  4. 阿里开发者招聘节 | 面试题02-04:给定一个二叉搜索树(BST),找到树中第K小的节点

    为帮助开发者们提升面试技能.有机会入职阿里,云栖社区特别制作了这个专辑--阿里巴巴资深技术专家们结合多年的工作.面试经验总结提炼而成的面试真题这一次将陆续放出(面试题官方参考答案将在专辑结束后统一汇总 ...

  5. 二叉搜索树BST的学习

    文章目录 二叉搜索树BST 什么是BST? 用BST做什么? 一.BST的特性 BST的特性是什么? 1.[230. 二叉搜索树中第K小的元素](https://leetcode.cn/problem ...

  6. 真c++ 从二叉树到红黑树(3)之二叉搜索树BST

      此文章为从二叉树到红黑树系列文章的第三节,主要介绍介绍二叉搜索树BST,为AVL和RedBlack打下基础 文章目录 一.前面文章链接~(点击右边波浪线可以返回目录) 二.二叉搜索树BST的定义~ ...

  7. 二叉搜索树的算法实现

    文章目录 1 二叉搜索树简介 2 二叉搜索树的算法实现 2.1 节点结构体的定义 2.2 二叉搜索树插入节点 2.3 二叉搜索树删除结点 2.4 二叉搜索树搜索 2.5 二叉搜索树的遍历 1 二叉搜索 ...

  8. 五.树,二叉树,二叉搜索树(BST)和自平衡二叉搜索树(AVL)

    1.树 树是一种数据结构 比如:目录结构 树是一种可以递归定义的数据结构 树是由n个节点组成的集合: 如果 n=0, 那这是一颗空树 如果 n>0, 那存在1个节点作为树的根节点,其他节点可以分 ...

  9. 二叉搜索树BST红黑树

    二叉搜索树基础知识 提起红黑树咱们肯定要先说说这个二叉搜索树(BST) 二叉搜索树又叫二叉查找树,二叉排序树:它具有以下特点: 如果它的左子树不为空,则左子树上结点的值都小于根结点. 如果它的右子树不 ...

最新文章

  1. AI居然能算出情侶能交往多久?使用分析语音数据進行預測
  2. 服务器中加速BIOS启动的方法
  3. 获取某一扩展名的文件集合
  4. AutoHotKey程序防止反编译的简单手段
  5. Linux应用编程之共享内存实例
  6. 大学计算机导论报告,大学计算机导论论文参考.docx
  7. jQuery:从零开始,DIY一个jQuery(1)
  8. 基于FPGA实现Camera Link接口
  9. 添加CAB最大压缩到右键菜单
  10. 表级触发器不支持ddl语句_用于视图,过程和函数的数据库级DDL触发器
  11. python工资高还是java-Python工资高还是Java?
  12. oracle存储过程更新权限不足,oracle创建存储过程时报权限不足
  13. oracle系统卸载干净,完全卸载oracle|oracle卸载|彻底卸载oracle
  14. 正规矩阵的谱分解MATLAB,正规矩阵的谱分解.PDF
  15. 论文的格式: 以Wiley为案例
  16. PTA(Java类与对象 方法,方法重载) 7-1 设计一个风扇Fan类
  17. 自定义身份证输入键盘
  18. Linux网卡应用程序测试
  19. python把txt导入excel_python如何将txt文件导入excel
  20. Windows操作系统基础

热门文章

  1. 北森云计算2023校招提前批面经
  2. JavaScript——WebAPI
  3. 产品读书《人月神话》
  4. Element UI 使用 el-carousel 焦点图
  5. [转]大量正版软件下载链接 1
  6. QWebEngineView显示网页白屏
  7. 社区奖品之Alarm Clock逃跑闹钟
  8. JS与HTML、CSS实现2048小游戏(一)
  9. 十六进制与十进制之间的相互转换
  10. Yield Guild Games 与 Walken 达成合作