zoukankan      html  css  js  c++  java
  • 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;      
        }
    };

    拓展学习

  • 相关阅读:
    字符编码解码
    综合练习[购物车]
    for 循环实例
    数据类型
    字符串格式化输出
    集成开发环境
    while循环实例
    赋值运算符、逻辑运算符、表达式
    if,else语句猜最大值
    计算今天和今天的上一月的日期
  • 原文地址:https://www.cnblogs.com/BoysCryToo/p/13526278.html
Copyright © 2011-2022 走看看