二叉查找树(BST)

一、定义

二叉查找树又名二叉搜索树,其中左结点的值小于父节点的值,右结点的值大于父节点的值。

  1. 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
  2. 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
  3. 任意节点的左、右子树也分别为二叉查找树;
  4. 没有键值相等的节点。

例如:将有序数列nums [ 2 0 4 6 8 9]变为一棵二叉搜索树

(1)取一个元素作为二叉树的根结点,我一般习惯于中间结点 mid=(L+R)/2;

(2)进行L和R的判断,如果L<R,就说明在L和R范围内没有小于他或者大于该节点的数,返回null

(3)更新L和R的范围,左子树为小于nums[ mid ]的数,右子树为大于nums[ mid ]的数。

(4)创建完成后树的结构为

 如果不是有序元素,可以将其进行排序,使他变成有序元素,然后再进行创建。

108. 将有序数组转换为二叉搜索树

难度简单1295收藏分享切换为英文接收动态反馈

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

示例 1:

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

 

示例 2:

输入:nums = [1,3]
输出:[3,1]
解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums 按 严格递增 顺序排列

 

题解:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

struct TreeNode * creat(int *nums,int L,int R)
{
     struct TreeNode *base;
    if(L>R)
     return NULL;
    int mid=(L+R)/2; 
    base=(struct TreeNode*)malloc(sizeof(struct TreeNode));
    base->val=nums[mid];
    base->left=creat(nums,L,mid-1);
    base->right=creat(nums,mid+1,R);
    return base;
}
struct TreeNode* sortedArrayToBST(int* nums, int numsSize){
   return creat(nums,0,numsSize-1);
    
}

 

二、在二叉树中查找元素

如果我们需要在有序数列中寻找元素,可以使用二叉查找树,这个方法和二分查找很类似,我没让你需要判断需要查找到数值 x 是大于根节点还是小于根节点,如果小于根节点,我们就在左子树中寻找,否则就在右子树方向查找。 

struct TreeNode
{
  int data;
  struct TreeNode *left;
  struct TreeNOde *right;
};

struct TreeNode *find(struct TreeNode *bst,int x)
{
  if(!bst) return NULL; //判断该树为空
  if(x>bst->data)  //如果元素大于节点值,就在该节点的右子树找
    return find(bst->right,x); 
  else if(x<bst->data)
    return find(bst->left,x);  //如果元素小于节点值,就在该节点的左子树找
  else 
    return bst; //查找到该元素,就返回他的地址
}

我明天将平衡二叉树学一下,然后进行链表的二叉搜索树。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值