LeetCode 109——有序链表转化二叉搜索树

栏目: 数据库 · 发布时间: 7年前

内容简介:在将有序数组转化为二叉搜索树的核心思想就是如下图所示,当 slow 指针指向中间节点时,last 指针指向中间节点的上一个节点,slow->next 是右子链的头结点,而将 last->next 指向 NULL 后,左子链的头节点即为 head。
LeetCode 109——有序链表转化二叉搜索树

2. 解答

2.1. 方法一

LeetCode 108——将有序数组转化为二叉搜索树 中,我们已经实现了将有序数组转化为二叉搜索树。因此,这里,我们可以先遍历一遍链表,将节点的数据存入有序数组中,然后再将有序数组转化为二叉搜索树即可。

class Solution {
public:
    TreeNode* sortedListToBST(ListNode* head) {
        
        vector<int> nums;
        
        while (head != NULL)
        {
            nums.push_back(head->val);
            head = head->next;
        }
        
        return sortedArrayToBST(nums, 0, nums.size()-1);
    }
    
    TreeNode* sortedArrayToBST(vector<int>& nums, int begin, int end) {
        
        if (end < begin) return NULL; // 数组为空
        int mid = begin + (end - begin) / 2;
                
        TreeNode * tree = new TreeNode(nums[mid]); // 中值作为根节点
        tree->left = sortedArrayToBST(nums, begin, mid-1); // 左子树
        tree->right = sortedArrayToBST(nums, mid+1, end); // 右子树
        
        return tree;
    }
};
复制代码

2.2. 方法二

将有序数组转化为二叉搜索树的核心思想就是 找到数组的中间数据,以此为根节点,然后再递归建立左右子树 。因此,借助于 LeetCode 876——链表的中间结点 中的思想,我们可以快速地找到链表的中间节点,然后再以中间节点前后的两个子链分别建立左右子树即可。

如下图所示,当 slow 指针指向中间节点时,last 指针指向中间节点的上一个节点,slow->next 是右子链的头结点,而将 last->next 指向 NULL 后,左子链的头节点即为 head。

LeetCode 109——有序链表转化二叉搜索树

此外,要注意一种特殊情况,当只有一个节点时,此时 last、slow、fast 都指向这个节点,那么 左子链此时应为空

LeetCode 109——有序链表转化二叉搜索树
class Solution {
public:
    TreeNode* sortedListToBST(ListNode* head) {
        
        ListNode* last = head;
        ListNode* slow = head;  
        ListNode* fast = head;  

        // 循环结束时慢指针指向中间结点
        while(fast && fast->next)   
        {
            last = slow;
            slow = slow->next; 
            fast = fast->next->next;
        }
        
        if (slow == NULL) return NULL;
                
        TreeNode * tree = new TreeNode(slow->val); // 中值作为根节点
        
        if (last == slow) tree->left = NULL;
        else
        {         
            last->next = NULL;
            tree->left = sortedListToBST(head); // 左子树
        }
        tree->right = sortedListToBST(slow->next); // 右子树
        
        return tree;
        
    }
    
};
复制代码

获取更多精彩,请关注「seniusen」!

LeetCode 109——有序链表转化二叉搜索树

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

云计算安全与隐私

云计算安全与隐私

Tim Mather、Subra Kumaraswamy、Shahed Latif / 刘戈舟、杨泽明、刘宝旭 / 机械工业出版社华章公司 / 2011-6 / 65.00元

《云计算安全与隐私》可以使你明白当把数据交付给云计算时你所面临的风险,以及为了保障虚拟基础设施和网络应用程序的安全可以采取的行动。本书是由信息安全界知名专家所著,作者在书中给出许多中肯的忠告和建议。本书的读者对象包括:IT职员、信息安全和隐私方面的从业人士、业务经理、服务提供商,以及投资机构等。阅读本书你会了解直到现在还严重匮乏的云计算安全方面的详尽信息。 《云计算安全与隐私》主要内容包括:......一起来看看 《云计算安全与隐私》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具