码迷,mamicode.com
首页 > 其他好文 > 详细

【一天一道LeetCode】#109. Convert Sorted List to Binary Search Tree

时间:2016-07-03 20:02:23      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:

一天一道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;
    }
};

【一天一道LeetCode】#109. Convert Sorted List to Binary Search Tree

标签:

原文地址:http://blog.csdn.net/terence1212/article/details/51793410

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!