一、定义
二叉查找树又名二叉搜索树,其中左结点的值小于父节点的值,右结点的值大于父节点的值。
- 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
- 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
- 任意节点的左、右子树也分别为二叉查找树;
- 没有键值相等的节点。
例如:将有序数列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)创建完成后树的结构为
如果不是有序元素,可以将其进行排序,使他变成有序元素,然后再进行创建。
难度简单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; //查找到该元素,就返回他的地址
}
我明天将平衡二叉树学一下,然后进行链表的二叉搜索树。