Skip to content

Latest commit

 

History

History
executable file
·
107 lines (54 loc) · 3.54 KB

109. Convert Sorted List to Binary Search Tree.md

File metadata and controls

executable file
·
107 lines (54 loc) · 3.54 KB

#

一天一道LeetCode

本系列文章已全部上传至我的github,地址:ZeeCoder‘s Github

欢迎大家关注我的新浪微博,我的新浪微博

欢迎转载,转载请注明出处

##(一)题目

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

##(二)解题

本题大意:给定一个单向链表,构造出平衡二叉搜索树

解题思路:参考【一天一道LeetCode】#108. Convert Sorted Array to Binary Search Tree

区别在于:如何找到中心根节点。这里运用到一个技巧。

利用两个指针p和q,p每次前进两个,q每次前进一个,当p==NULL或者p->next==NULL的时候q就是该链表的中心节点。

所以,仿照上一题不难写出代码:

/**

 * 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) {}

 * };

 */

class Solution {

public:

    TreeNode* sortedListToBST(ListNode* head) {

        return dfsBSTree(head,NULL);

    }

    TreeNode* dfsBSTree(ListNode* head , ListNode* tail)

    {

        if(head==tail) return NULL;//头节点等于尾节点的情况,返回NULL

        ListNode* p = head;

        ListNode* pm = head;

        while(p!=tail&&p->next!=tail)//利用快慢指针找到链表中点,这里考虑到以中心节点作为尾节点的情况,判断条件不为while(p&&p->next)

        {

            p = p->next->next;

            pm = pm->next;

        }

        TreeNode* root = new TreeNode(pm->val);

        while(head->next == tail) return root;//只有一个节点的情况

        root->left = dfsBSTree(head,pm);//找左子树

        root->right = dfsBSTree(pm->next,tail);//找右子树

        return root;

    }

};