109. 有序链表转换二叉搜索树

题目

109. 有序链表转换二叉搜索树

我的思路

两种思路:
思路1:按照顺序遍历单链表,把元素逐个插入到新构造的平衡二叉树中。插入方法:根据最新节点处于导致最低不平衡子树的根的位置决定进行四中旋转中的一种:LL、LR、RL、RRhttps://www.cnblogs.com/idreamo/p/8308336.html

思路2:利用单链表顺序排序的特点,直接构造成平衡二叉树。法一:不断二分单链表,取中间元素作为新的根节点(因为二分法的话,可以保证左子树节点数量最多比右子树多1,所以保证了层数最多多1,满足平衡树要求)。法二:构造完全搜索 二叉树,因为完全二叉树一定是平衡的,已知节点数量可以确定完全二叉树的结构,根据数学推导可以直接得到节点所在二叉树的位置

我的实现

class Solution {
public:
    vector<int> vec;
    TreeNode *ROOT;
    void createBT(int l,int r,TreeNode *root,bool left){
        if(root!=NULL){
            if(l<=r){
                int mid = (l+r+1)/2;
                TreeNode* temp =new TreeNode(vec[mid]);
                if(left){root->left = temp;}
                else{root->right = temp;}
                createBT(l,mid-1,temp,true);
                createBT(mid+1,r,temp,false);
            }
        }
    }
    TreeNode* sortedListToBST(ListNode* head) {
        //先把链表转化成一个可随机访问的数组
       
        while(head!=nullptr){vec.push_back(head->val);head = head->next;}
        if(vec.size()>0){
            ROOT = new TreeNode(vec[vec.size()/2]);
            createBT(0,vec.size()/2-1,ROOT,true);
            createBT(vec.size()/2+1,vec.size()-1,ROOT,false);
        }
        return ROOT;      
    }
};

拓展学习

原文地址:https://www.cnblogs.com/BoysCryToo/p/13526278.html