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;
        }
    };
  • 相关阅读:
    Linux从入门到进阶全集——【第十四集:Shell编程】
    cmake 编译 c++ dll 的一个例子
    %1 不是有效的Win32应用程序
    C++ 生成 dll 和调用 dll 的方法实例(转)
    Clion cmake 一个简单的 C++ 程序
    一月4
    一月4日
    1月4日
    一月4日
    一月4日
  • 原文地址:https://www.cnblogs.com/xbf9xbf/p/4508690.html
Copyright © 2011-2022 走看看