内容简介:在将有序数组转化为二叉搜索树的核心思想就是如下图所示,当 slow 指针指向中间节点时,last 指针指向中间节点的上一个节点,slow->next 是右子链的头结点,而将 last->next 指向 NULL 后,左子链的头节点即为 head。
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。
此外,要注意一种特殊情况,当只有一个节点时,此时 last、slow、fast 都指向这个节点,那么 左子链此时应为空 。
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」!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- js的类型转化三两事儿
- archTIS:将数据安全转化为经济增长
- 如何将JavaScript转化成Swift?(一)
- python3 第十章 - 如何进行进制转化
- 用Golang将图片转化成ASCII码
- 记一次bug解决过程(数字转化成中文)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
疯狂Java讲义
李刚 / 电子工业出版社 / 2014-7-1 / 109.00元
《疯狂Java讲义(第3版)(含CD光盘1张)》是《疯狂Java讲义》的第3版,第3版保持了前两版系统、全面、讲解浅显、细致的特性,全面新增介绍了Java 8的新特性,《疯狂Java讲义(第3版)(含CD光盘1张)》大部分示例程序都采用Lambda表达式、流式API进行了改写,因此务必使用Java 8的JDK来编译、运行。 《疯狂Java讲义(第3版)(含CD光盘1张)》深入介绍了Java编......一起来看看 《疯狂Java讲义》 这本书的介绍吧!