首页 > 其他分享 >二叉搜索树

二叉搜索树

时间:2024-11-21 12:31:24浏览次数:1  
标签:node return BST nullptr 二叉 搜索 ans root

应用

BST通过优先级来构建一棵树,有利于我们系统的架构时,根据具体框架的优先级来便于构建系统的结构树,方便我们的查找和插入。

性质

  • 左子树的元素均小于根节点
  • 右子树的元素均大于根节点
  • 左右子树均为二叉搜索树
    和堆的结构类似,只不过根和子树的大小关系的不同,但均是通过元素的大小关系来构建树的整体结构

查找

查找某个元素,我们可以通过既有的元素的大小关系来简化搜索的过程。

Position Find( ElementType X, BinTree BST )
{
	if( !BST ) return NULL; /*查找失败*/
	if( X > BST->Data )
		return Find( X, BST->Right ); /*在右子树中继续查找*/
	else if( X < BST->Data )
		return Find( X, BST->Left ); /*在左子树中继续查找*/
	else /* X == BST->Data */
		return BST; /*查找成功,返回结点的找到结点的地址*/
}

插入

BinTree Insert( BinTree BST, ElementType X )
{
    if( !BST ){ /* 若原树为空,生成并返回一个结点的二叉搜索树 */
        BST = (BinTree)malloc(sizeof(struct TNode));
        BST->Data = X;
        BST->Left = BST->Right = NULL;
    }
    else { /* 开始找要插入元素的位置 */
        if( X < BST->Data )
            BST->Left = Insert( BST->Left, X );   /*递归插入左子树*/
        else  if( X > BST->Data )
            BST->Right = Insert( BST->Right, X ); /*递归插入右子树*/
        /* else X已经存在,什么都不做 */
    }
    return BST;
}

习题

验证二叉搜索树

98. 验证二叉搜索树 - 力扣(LeetCode)

解法一:验证该节点和子树之后再判断整个左子树和右子树的大小是否符合要求。
    bool isValidBST(TreeNode* root) {
        if(!root) return true;
        if((root->left!=nullptr&&root->val<=root->left->val)||(root->right!=nullptr&&root->val>=root->right->val)) return false;
        if(!isValidBST(root->left)||!isValidBST(root->right)) return false;
        if((root->left!=nullptr&&maxx(root->left)>=root->val)||(root->right!=nullptr&&minn(root->right)<=root->val)) return false;
        return true;
    }
    int maxx(TreeNode* node)
    {
        int ans=node->val;
        if(!node) return 0;
        if(node->left!=nullptr) ans=max(ans,maxx(node->left));
        if(node->right!=nullptr) ans=max(ans,maxx(node->right));
        return ans;
    }
    int minn(TreeNode* node )
    {
        int ans=node->val;
        if(!node) return 0;
        if(node->left!=nullptr) ans=min(ans,minn(node->left));
        if(node->right!=nullptr) ans=min(ans,minn(node->right));
        return ans;
    }
解法二:中序遍历。利用BST树之间的大小关系,我们可以得到中序遍历后的序列是一个单调的上升序列。

巧妙地利用中序遍历将大小关系转换为线性结构中的序的问题

bool isValidBST(TreeNode* root) {
        stack<TreeNode*> stack;
        long long inorder = (long long)INT_MIN - 1;

        while (!stack.empty() || root != nullptr) {
            while (root != nullptr) {
                stack.push(root);
                root = root -> left;
            }
            root = stack.top();
            stack.pop();
            // 如果中序遍历得到的节点的值小于等于前一个 inorder,说明不是二叉搜索树
            if (root -> val <= inorder) {
                return false;
            }
            inorder = root -> val;
            root = root -> right;
        }
        return true;
    }

构造二叉搜索树

由严格的单调的数组变化为平衡的二叉搜索树-->分治思想,每次取中间的mid,将其分为两段,再由其去分配。由于我们是取中间的,导致我们最后所得的树的结构必为平衡的结构。

 TreeNode* sortedArrayToBST(vector<int>& nums) {
        return BST(0,nums.size()-1,nums);
    }
    TreeNode* BST(int l,int r,vector<int>& nums)
    {
        if(l==r)
        {
            TreeNode* node=new TreeNode(nums[l]);
            return node;
        }
        if(r<l) return nullptr;
        int mid = l+r>>1;
        TreeNode* node=new TreeNode(nums[mid],BST(l,mid-1,nums),BST(mid+1,r,nums));
        return node;
    }

标签:node,return,BST,nullptr,二叉,搜索,ans,root
From: https://www.cnblogs.com/lijia123/p/18560435

相关文章

  • PbootCMS获取结果页面的搜索keyword值和tag值
    搜索关键词keyword如果您的搜索结果页面地址后缀为?keyword=三角形,那么获取关键词方式为{$get.keyword}。该标签可用于搜索列表页面获取搜索关键词的值,可以搭配分页条的总数据行数属性({page:rows})。tag关键词如果您的搜索结果页面地址后缀为/tag/伪静态配置.html,那么获......
  • HarmonyOS 开发实践 —— 基于Search组件实现搜索栏
    ......
  • 数据结构在二叉树中用子问题思路来解决问题
    二叉树Oj题获取二叉树的节点数获取二叉树的终端节点个数获取k层节点的个数获取二叉树的高度检测为value的元素是否存在判断两颗树是否相同判断是否是另一棵的子树反转二叉树判断一颗二叉树是否是平衡二叉树时间复杂度O(n*n)复杂度O(N)二叉树的遍历判断是否是对称的二叉......
  • AI之旅-语义搜索:初识 vector embedding 与部署向量数据库 qdrant
    AI之旅实现的第一个功能是基于大模型的vectorembedding进行语义搜索(semanticsearch)。(图片来源:kdnuggets.com)基于大模型实现的聊天机器人虽然能打字和你聊天,但大模型却大字不识一个,它只识数(向量)与只会计算,它不会玩文字游戏,只会玩数字游戏。任何一段文字,在大模型的眼里只是......
  • 利用PHP爬虫获取1688搜索词推荐的技巧与实践
    在当今的电商时代,关键词优化是提升产品曝光率的关键。1688作为中国领先的B2B电商平台,其搜索词推荐功能对于商家来说具有极高的价值。通过获取这些推荐词,商家可以更好地了解市场趋势,优化产品标题,提高搜索排名。本文将介绍如何使用PHP编写爬虫,以获取1688的搜索词推荐,并提供代码示......
  • 数据结构/第五章 树与二叉树/数据结构习题/树与二叉树的习题/考研/期末复习
    一、选择题1.一棵树中,所有结点的度数之和为n,则该树共有(    )个结点。A.n-1   B.n   C.n+1   D.无法确定2.高度为4的3叉树至多有(    )个结点。A.6   B.27   C.40   D.803.度为m的树中第6层至多有(    ......
  • 洛谷题单指南-二叉堆与树状数组-P2161 [SHOI2009] 会场预约
    原题链接:https://www.luogu.com.cn/problem/P2161题意解读:本题前面形式化描述已经足够清晰。解题思路:要判断线段之间是否有冲突(包含或者交叉),可以借助set,参考:https://www.cnblogs.com/jcwy/p/18447333只不过这里要统计冲突的数量,也就是允许相等的元素重复存在,可以借助multiset......
  • 力扣 LeetCode 111. 二叉树的最小深度(Day7:二叉树)
     解题思路:用后序遍历题目要求的最小深度为根节点到叶子节点的最小深度,注意是到根节点,所以如图所示假设(没有9这个节点)是需要返回3的,而不是1(根节点左子树为空的情况),于是需要加两层判断其余部分可参考求最大深度的思路,有一定相似之处classSolution{publicintminDe......
  • 实时信息获取神器:深入体验ChatGPT的全新搜索功能
    OpenAI最近发布了新的ChatGPT搜索功能,这一功能旨在让用户能够实时搜索并获取最新的网络信息。这不仅拓宽了ChatGPT的应用范围,还为用户提供了更强大的信息获取渠道。用户现在可以像在搜索引擎中一样,输入问题来找到特定的答案,无论是最新的新闻、体育赛事结果、天气预报,还是股......
  • 【PTA】求二叉树的右视图
    1.题目描述将二叉树的“右视图”定义为从二叉树右侧能看到的所有结点从上到下排列形成的序列。如下图所示的二叉树,其右视图就是{A,C,I,H}。 二叉树中的数据元素为单个字符,且各不相同,取值范围为A~Z或a~z之间的字符,二叉树不为空。在第3次上机“二叉树的建立和遍历”......