题目描述
知识点
二分查找(Binary Search) 和 二分查找树(Binary Search Tree) 的关系
结果
时间空间都在范围之内,菜鸟我已经很满意了。。。
实现
码前思考
- 一开始以为这是一个典型的不能再典型的 平衡二叉树(AVL Tree) 的问题,后来思考了一下,这个题咋正确率有70%???AVL Tree应该正确率低些呀,于是我想应该还有其他方法。
- 我来我想了想貌似可以通过二分的方式(突然觉得自己的🧠在线了)建树,不用使用AVL树。
- 这下我终于知道为啥叫二分查找树了, 因为二分查找(BS)就可以构成这样一棵二分查找树(BST),而且还是高度差不超过1的二分查找树
- 但是为了练习模板还是用AVL树,结果我发现这里的
TreeNode
是定义死的结构体,但是我们AVL是要保存高度height
的,所以尝试AVL失败。。。而且要考虑重复的数值情况,所以对val
进行映射得到height
也不行了。。。 - 所以最后拜倒在二分的门下,还是用二分吧。。。
代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
//这是一个平衡二叉树(AVL Tree)的问题
//需要不断地调整结点来满足题中的条件
//貌似可以通过二分的方式建树,不用使用AVL树
//终于知道为啥叫二分查找树了,
//因为二分查找(BS)就可以构成这样一棵二分查找树(BST),而且还是高度差不超过1的二分查找树
//但是为了练习模板还是用AVL树
//因为是升序所以不考虑重复的情况?其实是要考虑重复的情况的。。。
//好像不可以用AVL Tree了。。。
class Solution {
private:
vector<int> arr;
public:
TreeNode* sortedListToBST(ListNode* head) {
TreeNode* root = NULL;
//首先将链表转换成动态数组
while(head!=NULL){
arr.push_back(head->val);
head = head->next;
}
int len = arr.size();
//使用二分进行建树
//空树不需要进行特判,这里实现了!!!
root = BS(0,len-1);
return root;
}
//使用二分,函数的意思是返回left到right之间的子树的根结点
TreeNode* BS(int left,int right){
//递归边界
if(left > right){
return NULL;
}else{
int mid = (left+right)/2;
int val = arr[mid];
TreeNode* root = new TreeNode(val);
root->left = BS(left,mid-1);
root->right = BS(mid+1,right);
return root;
}
}
};