zoukankan      html  css  js  c++  java
  • leetcode

    题目:Convert Sorted List to Binary Search Tree

    Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.

    这道题和Convert Sorted Array to Binary Search Tree类似,只不过把有序数组换成了有序链表,主要的问题在于找到链表的中心节点

    个人思路:

    1、设置两个指针one和two,一个走一步,一个走两步,当two指针走到链表的尾部时,one指针便走到了链表的中心节点位置

    2、找到链表的中心节点后,剩下的步骤和http://www.cnblogs.com/laihaiteng/p/3795524.html这篇文章中的思路相同,不过边界条件(即递归的基本条件)要特别注意,可能每个人的做法不同会引起基本条件不同,我这里的是尾指针为NULL或者头指针是尾指针的下一个节点,则返回NULL

    代码:

     1 #include <stddef.h>
     2 
     3 struct ListNode
     4 {
     5     int val;
     6     ListNode *next;
     7     ListNode(int x) : val(x), next(NULL) {}
     8 };
     9 
    10 struct TreeNode
    11 {
    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 public:
    21     TreeNode *sortedListToBST(ListNode *head)
    22     {
    23         if (!head)
    24         {
    25             return NULL;
    26         }
    27 
    28         ListNode *tail = head;
    29         while (tail->next)
    30         {
    31             tail = tail->next;
    32         }
    33 
    34         TreeNode *root = build(head, tail);
    35 
    36         return root;
    37     }
    38 private:
    39     TreeNode *build(ListNode *begin, ListNode *end)
    40     {
    41         ListNode *one = begin;
    42         ListNode *two = begin;
    43         ListNode *middle = NULL;
    44         ListNode *middle_pre = NULL;
    45         ListNode *middle_next = NULL;
    46 
    47         if (!begin || end->next == begin)
    48         {
    49             return NULL;
    50         }
    51 
    52         while (two != end)
    53         {
    54             middle_pre = one;
    55             one = one->next;
    56             two = two->next;
    57             if (two == end)
    58             {
    59                 break;
    60             }
    61             two = two->next;
    62         }
    63         middle = one;
    64         middle_next = middle->next;
    65 
    66         TreeNode *root = new TreeNode(middle->val);
    67         root->left = build(begin, middle_pre);
    68         root->right = build(middle_next, end);
    69 
    70         return root;
    71     }
    72 };
    View Code

    网上看了一些文章,大致思路都是这样的,可能略微有一些小改动,就不贴出来了。

  • 相关阅读:
    Android Studio使用教程(一)
    Android Studio设置字体
    Android Studio设置字体
    8.8 Deep Learning Software
    梯度下降法与牛顿迭代法 求拟合参数
    什么是Condition Number(条件数)?
    什么是卷积?
    SLAM数据集
    TensorFlow安装教程
    Caffe
  • 原文地址:https://www.cnblogs.com/laihaiteng/p/3800755.html
Copyright © 2011-2022 走看看