zoukankan      html  css  js  c++  java
  • 【Convert Sorted List to Binary Search Tree】cpp

    题目:

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

    代码:

    /**
     * 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) {
                if ( !head ) return NULL;
                // p2 point to the pre node of mid
                ListNode dummy(-1);
                dummy.next = head;
                ListNode *p1 = &dummy, *p2 = &dummy;
                while ( p1 && p1->next && p1->next->next ) { p1 = p1->next->next; p2 = p2->next;}
                // get the mid val & cut off the mid from linked list
                int val = p2->next->val;
                ListNode *h2 = p2->next ? p2->next->next : NULL;
                p2->next = NULL;
                // recursive process
                TreeNode *root = new TreeNode(val);
                root->left = Solution::sortedListToBST(dummy.next);
                root->right = Solution::sortedListToBST(h2);
                return root;
        }
    };

    tips:

    1. 沿用跟数组一样的思路,采用二分查找

    2. 利用快慢指针和虚表头技巧;最终的目的是p2指向mid的前驱节点。

    3. 生成该节点,并递归生成left和right (这里需要注意传递的是dummy.next而不是head,原因是如果链表中只有一个节点,传head就错误了)

    ============================================

    第二次过这道题,熟练了一些。重点在于求ListNode的中间节点。

    /**
     * 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) {
                if (!head) return NULL;
                if (!head->next) return new TreeNode(head->val);
                ListNode* p1 = head;
                ListNode* pre = p1;
                ListNode* p2 = head;
                while ( p2 && p2->next )
                {
                    pre = p1;
                    p1 = p1->next;
                    p2 = p2->next->next;
                }
                TreeNode* root = new TreeNode(p1->val);
                pre->next = NULL;
                root->left = Solution::sortedListToBST(head);
                root->right = Solution::sortedListToBST(p1->next);
                return root;
        }
    };
  • 相关阅读:
    10. Regular Expression Matching
    9. Palindrome Number
    6. ZigZag Conversion
    5. Longest Palindromic Substring
    4. Median of Two Sorted Arrays
    3. Longest Substring Without Repeating Characters
    2. Add Two Numbers
    链式表的按序号查找
    可持久化线段树——区间更新hdu4348
    主席树——树链上第k大spoj COT
  • 原文地址:https://www.cnblogs.com/xbf9xbf/p/4508690.html
Copyright © 2011-2022 走看看