zoukankan      html  css  js  c++  java
  • leetcode链表--2、排序链表转平衡二叉树

    题目描述
     
    Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
     
    题目描述
    给定一个升序排列的有序单链表,将其转换为一棵平衡的二叉搜索树。
     
    二叉树搜索:对于所有节点,顺序是:left children <= current node <= right children;
    平衡vs.非平衡:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树;
     
    思路如下:
    由于二叉排序树的中序遍历即有序,也就是与本题中的单链表从头到尾遍历相同,所以可以按照类似中序遍历的做法。首先使用快慢指针找到应该的二叉搜索树的根节点。然后递归构建左右子树。
     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9 /**
    10  * Definition for binary tree
    11  * struct TreeNode {
    12  *     int val;
    13  *     TreeNode *left;
    14  *     TreeNode *right;
    15  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    16  * };
    17  */
    18 class Solution {
    19     //找到位于中间的根节点,返回
    20     ListNode *cutAtMid(ListNode *head)
    21     {
    22         if(head == NULL)
    23             return NULL;
    24         ListNode *fast = head;
    25         ListNode *slow = head;
    26         //pre指针的目的是把链表断开,保证slow前为一个链表,slow后为一个链表
    27         //使得在递归的时候求左子树时,head就为头到slow前一个
    28         ListNode* pre = NULL;//此处如果没有pre指针会出现段错误??
    29         while(fast!=NULL && fast->next != NULL)
    30         {
    31             pre = slow;  
    32             slow = slow->next;
    33             fast = fast->next->next;
    34         }
    35         pre->next = NULL;
    36          
    37         return slow;
    38     }
    39 public:
    40     TreeNode *sortedListToBST(ListNode *head)
    41     {
    42         if(head == NULL)
    43         {
    44             return NULL;
    45         }
    46  
    47         if(head->next == NULL) {
    48             return new TreeNode(head->val);
    49         }
    50  
    51         ListNode *mid = cutAtMid(head);
    52  
    53         TreeNode *root = new TreeNode(mid->val);
    54         root->left = sortedListToBST(head);//递归构建左右子树
    55         root->right = sortedListToBST(mid->next);
    56  
    57         return root;
    58     }
    59 };
  • 相关阅读:
    用户、群组、权限
    分页提纲
    网页分页显示
    OMR数据查询
    ORM增删改查询例题
    人工智能将推动云存储和数据服务的创新
    如何在智能家居中提高IoT安全性?
    云计算是物联网的重要支柱
    一个高薪的码农,应具备的8种能力
    如何跨越比特币的认知障碍?
  • 原文地址:https://www.cnblogs.com/qqky/p/6781751.html
Copyright © 2011-2022 走看看