二叉搜索树

习题4.3 是否二叉搜索树 (25 分)

匿名 (未验证) 提交于 2019-12-03 00:09:02
先介绍第一种方法,后序遍历。 思路很简单每次递归调用一次判断函数就能带回来子树T的最大值和最小值。另外要注意二叉搜索树的定义中的一点,简单来说就是 根结点的值一定大于左子树的最大值,小于右子树的最小值 。千万不要仅仅判断根结点与左右孩子大小的关系。 /*后序遍历判断*/ bool preJudge(BinTree T, int *minT, int *maxT) { int lmin,lmax,rmin,rmax; bool ans1 = false, ans2 = false; if(T==NULL) return true;//递归基 if((T->Left&&preJudge(T->Left,&lmin,&lmax)&&T->Data>lmax)||!T->Left) ans1 = true;//左子树为空,左子树为BST;左子树不为空则判断左子树是否为BST,再判断根结点是否大于左子树的最大值 if((T->Right&&preJudge(T->Right,&rmin,&rmax)&&T->Data<rmin)||!T->Right) ans2 = true;//同上 if(ans1&&ans2) { if(T->Left == NULL) *minT = T->Data;//左子树为空,那么T的最小值为T->Data; else *minT = lmin; if(T-

数据结构-二叉搜索树

匿名 (未验证) 提交于 2019-12-02 23:43:01
1.在一棵二叉搜索树上查找63,序列39、101、25、80、70、59、63是一种可能的查找时的结点值比较序列。 F 2.在一棵由包含4、5、6等等一系列整数结点构成的二叉搜索树中,如果结点4和6在树的同一层,那么可以断定结点5一定是结点4和6的父亲结点。 F 3.二叉搜索树的查找和折半查找的时间复杂度相同。 F 只有平衡的二叉搜索树才与折半查找时间复杂度相同 4.二叉搜索树的最小元素一定位于树根的左子树。 作者: DS课程组 单位: 浙江大学 1-3答案正确(2 分) 1-6 二叉搜索树的最小元素一定位于树根的左子树。 F 还可能是根结点 1.对二叉搜索树进行什么遍历可以得到从小到大的排序序列? A.前序遍历 B.后序遍历 C.中序遍历 D.层次遍历 2.在有 N 个结点且为完全二叉树的二叉搜索树中查找一个键值,其平均比较次数的数量级为: A.O(logN) B.O(N) C.O(NlogN) D.O(N 2 ) 3.已知8个数据元素为(34,76,45,18,26,54,92,65),按照依次插入结点的方法生成一棵二叉搜索树后,最后两层上的结点总数为: A.1 B.2 C.3 D.4 4.将{28, 15, 42, 18, 22, 5, 40}依次插入初始为空的二叉搜索树。则该树的后序遍历结果是: A.5, 15, 18, 22, 40, 42, 28 B.5, 22, 15

验证二叉搜索树

匿名 (未验证) 提交于 2019-12-02 23:42:01
这是一个中等题,但是难度很低 虽然知道二叉搜索树,但是写代码时,就忘了概念 最初写的(错误) 输入:[10,5,15,null,null,6,20] 输出:true 预期:false 题目: 给定一个二叉树,判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 输入: 输出: true 错误思路 : 只需要判断当前结点跟他左右结点比就OK,这是错误的 正确思路: 使用中序遍历(在二叉树中,中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。) 我贴了两个代码 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> a1; bool isValidBST(TreeNode* root) { if(root==NULL) return true; ss(root); int len=a1

二叉搜索树中第K小的元素

匿名 (未验证) 提交于 2019-12-02 23:34:01
二叉搜索树中第K小的元素 LeetCode中文 LeetCode英文 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。 说明 : 你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。 示例 1 : 输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \ 2 输出: 1 示例 2: 输入: root = [5,3,6,2,4,null,null,1], k = 3 5 / \ 3 6 / \ 2 4 / 1 输出: 3 进阶 : 如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化 kthSmallest 函数? 解答 中序遍历二叉搜索树,在遍历的过程中,每经过一个节点将 k 减1,当 k == 0 的时候,则找到了第k小的元素( 注意边界 )。 C++代码 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: void

平衡二叉树(二叉搜索树)

有些话、适合烂在心里 提交于 2019-12-02 23:32:49
    平衡二叉树(Balanced Binary Tree)具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。 最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。   特殊的二叉树,又称为排序二叉树、二叉搜索树、二叉排序树。    二叉查找树实际上是数据域有序的二叉树, 即对树上的每个结点,都满足其左子树上所有结点的数据域均小于或等于根结点的数据域, 右子树上所有结点的数据域均大于根结点的数据域。如下图所示: 其中左节点要比当前子树根节点小,右节点要比当前子树根节点大,如第一次进入二叉树, 根节点为temp为5,再进来3和根节点比较,发现根节点的左节点为空,所以3放在5的左节点,进来7,比5大,5的右节点为空,7到5的右节点,再进来2,找到5,比5小,进去继续找,发现5的左节点不为空,temp为3作当前小平衡树的根,发现3的左为空,此时将2放到3的左节点.... 代码实现: #include<stdio.h> #include<stdlib.h> typedef struct node{ int

LeetCode解题汇总目录

a 夏天 提交于 2019-12-02 17:37:52
此篇为学习完 《数据结构与算法之美》 后,在 LeetCode 刷题的汇总目录,方便大家查找(Ctrl+F ind ),一起刷题,一起PK交流!Updated on 2019.12.2 刷题可以按照 不同的专题 进行,便于加强某个知识点的理解。 我的 LeetCode 主页 我的 GitHub 主页 已解决 519/1185 - 简单 281 中等 208 困难 30 2019.7.24 - 2019.11.9,108天做了400道题 2019.11.9 - 2019.11.24, AC+100道,4个月共计500道题 参赛记录 LeetCode 2019 力扣杯全国秋季编程大赛 ​ 已解题目,部分太简单的没有列出 LeetCode 1. 两数之和(哈希) LeetCode 2. 两数相加(单链表反转) LeetCode 3. 无重复字符的最长子串(滑动窗口+哈希) LeetCode 4. 寻找两个有序数组的中位数(二分查找,难) LeetCode 7. 整数反转 LeetCode 8. 字符串转换整数 (atoi) LeetCode 9. 回文数 LeetCode 11. 盛最多水的容器(双指针) LeetCode 14. 最长公共前缀 LeetCode 15. 三数之和 LeetCode 16. 最接近的三数之和(固定左端+滑动窗口) LeetCode 17.

剑指offer--链表、树--二叉搜索树与双向链表

与世无争的帅哥 提交于 2019-12-02 15:05:35
二叉搜索树与双向链表 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的 双向链表 。要求不能创建任何新的结点,只能调整树中结点指针的指向。 思路 举例说明: 二叉搜索树如上图所示,我们将其转换为配需双向链表。 根据二叉搜索树的特点:左结点的值<根结点的值<右结点的值,我们不难发现,使用 二叉树 的中序遍历出来的数据的数序,就是排序的顺序。因此,首先,确定了二叉搜索树的遍历方法。 接下来,我们看下图,我们可以把树分成三个部分:值为10的结点、根结点为6的左子树、根结点为14的右子树。根据排序双向链表的定义,值为10的结点将和它的左子树的最大一个结点链接起来,同时它还将和右子树最小的结点链接起来。 按照中序遍历的顺序,当我们遍历到根结点时,它的左子树已经转换成一个排序的好的双向链表了,并且处在链表中最后一个的结点是当前值最大的结点。我们把值为8的结点和根结点链接起来,10就成了最后一个结点,接着我们就去遍历右子树,并把根结点和右子树中最小的结点链接起来。 主函数 打印函数 public static void main(String[] args) { TreeNode node10 = new TreeNode(10); TreeNode node6 = new TreeNode(6); TreeNode node14 = new TreeNode(14); TreeNode

BinarySearchTree-二叉搜索树

对着背影说爱祢 提交于 2019-12-02 12:52:29
BinarySearchTree-二叉搜索树 ​ 二叉查找树(Binary Search Tree)。搜索,插入,删除的复杂度等于树高,O(log(n))。 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树; 代码实现如下: /*****BinarySearchTree*****/ //根节点左边的数据比根节点小,右边比根节点大,子树也一样 #include <iostream> #include <stack> using namespace std; class BinarySearchTree { private: int data; BinarySearchTree *left; BinarySearchTree *right; public: BinarySearchTree(int x): data(x), left(nullptr), right(nullptr) {} //插入 void Insert(BinarySearchTree *root,int x) { if(root->data<x) //根节点的data<x,则插入右子树 { if(root->right==nullptr) root->right = new

c++之二叉搜索树

旧城冷巷雨未停 提交于 2019-12-02 12:47:14
二叉搜索树及其基本操作 1.二叉搜索树的概念 二叉搜索树又称为二叉排序树,它或者是一颗空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则其左子树上所有节点的值都小于其根结点的值 若它的右子树不为空,则其右子树上所有节点的值都大于其根结点的值 它的左右子树也都是二叉搜索树 2.二叉搜索树的基本操作 2.1二叉搜索树的查找 原理: 若根结点不为空: 如果根结点key==查找key 返回true 如果根结点key>查找key 在其左子树查找 如果根结点key<查找key 在其右子树查找 代码实现: Node * Find ( const T & data ) { if ( _pRoot == nullptr ) { return NULL ; } Node * pCur = _pRoot ; while ( pCur ) { if ( data == pCur -> _data ) { return pCur ; } else if ( data < pCur -> _data ) { pCur = pCur -> _pLeft ; } else { pCur = pCur -> _pRight ; } } return nullptr ; } 2.2二叉搜索树的插入 插入过程: 1. 树为空,直接插入 2. 树不空,按二叉搜索树性质找到插入位置,插入结点 代码如下: bool

AVL树

家住魔仙堡 提交于 2019-12-02 12:45:44
AVL树 二叉搜索树虽然可以缩短查找的效率,**但如果数据有序或接近有序二叉搜索树退化为单支树,查找元素相当与在顺序表中搜索元素,效率低下。**当向二叉搜索树中插入新节点后,如果能保证每个节点的左右子树高度之差绝对值不超过1(需要对树中的节点进行调整),即可降低树的高度,从而减少平均搜索长度。 空树也是AVL树。 AVL树的性质是: 它的左右子树都是AVL树 左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1) 如果一棵二叉搜索树是高度平衡的,它就是AVL树。如果它有n个节点,其高度可保持在Olg(N),搜索时时间复杂度为Olg(N) AVL树的节点的定义 template < class T > struct AVLTreeNode { AVLTreeNode ( const T & data = T ( ) ) : _pLeft ( nullptr ) , _pRight ( nullptr ) , _bf ( 0 ) , _pParent ( nullptr ) , _data ( data ) { } AVLTreeNode < T > * _pLeft ; AVLTreeNode < T > * _pRight ; AVLTreeNode < T > * _pParent ; int _bf ; //该节点的平衡因子 T _data ; } ; AVL树的实现