有序链表转化为平衡的二分查找树
来源:互联网 发布:python web开发入门 编辑:程序博客网 时间:2024/04/19 12:52
给定一个升序排列的有序单链表,将其转换为一棵平衡的二叉搜索树。
题目链接:https://oj.leetcode.com/problems/convert-sorted-list-to-binary-search-tree/
比较直观的解法是自顶向下的递归解决,先找到中间节点作为根节点,然后递归左右两部分。所有我们需要先找到中间节点,对于单链表来说,必须要遍历一边,可以使用快慢指针加快查找速度。
代码如下:
#include<iostream>#include<queue>using namespace std;/* node of binary tree */struct TreeNode{int data;TreeNode* lChild;TreeNode* rChild;TreeNode(int _data) { data = _data; lChild = rChild = nullptr; }};/* node of singly-linked list */struct ListNode{int data;ListNode* next;ListNode(int _data) { data = _data; next = nullptr; }};/* construct a singly-linked list */void ConstructList(ListNode* & _head){cout << "请输入一个升序的数组,以0结束: ";int d;ListNode* p;cin >> d;if (d){_head = new ListNode(d);p = _head;while (cin >> d&&d){p->next = new ListNode(d);p = p->next;}}}/* a sorted singly-linked list to a AVL*/TreeNode* SortedListToAVL(ListNode* & _head){if (!_head) return nullptr;if (!_head->next) return (new TreeNode(_head->data));//用快慢指针找到中间节点ListNode* preslow, *slow, *fast;preslow = nullptr;slow = fast = _head;while (fast->next&&fast->next->next){preslow = slow;slow = slow->next;fast = fast->next->next;}TreeNode* mid = new TreeNode(slow->data);//分别递归左右两部分if (preslow){preslow->next = nullptr;mid->lChild = SortedListToAVL(_head);}mid->rChild = SortedListToAVL(slow->next);return mid;}/* level order of binary tree */void LevelOrder(TreeNode* & _root){cout << "二叉树的层次遍历为: ";queue<TreeNode*> q;q.push(_root);while (!q.empty()){cout << q.front()->data << " ";if (q.front()->lChild)q.push(q.front()->lChild);if (q.front()->rChild)q.push(q.front()->rChild);q.pop();}cout << endl;}int main(){ListNode* listHead;TreeNode* TreeRoot;ConstructList(listHead);TreeRoot = SortedListToAVL(listHead);LevelOrder(TreeRoot);/*输入:1 2 3 4 5 6 7 8 9 0输出:5 2 7 1 3 6 8 4 9所构造的AVL是: 5/ \ 2 7 / \ / \ 1 3 6 8 \ \ 4 9*/return 0;}
题目来自: http://www.acmerblog.com/convert-sorted-list-to-binary-search-tree-6124.html
1 0
- 有序链表转化为平衡的二分查找树
- 有序递增链表转化为平衡的二叉搜索树(LeetCode: Convert Sorted List to Binary Search Tree )
- 有序表的二分查找
- 将有序单链表转化为平衡二叉树
- Convert Sorted List to Binary Search Tree 将有序链表转化为平衡二叉排序树
- 二分查找树转化为排序的循环双链表
- 排序列表转化为二分查找树
- 有序单向链表转换为平衡搜索二叉树
- 有序链表转换为平衡二叉树(BST)
- 有序表上的二分查找
- 算法:有序表的二分查找
- BinarySearch 有序表的二分查找
- 查找:链表顺序查找和有序数组二分查找
- 平衡二叉树转化为双向链表
- 二叉搜索树转化为有序双向链表
- 二叉搜索树转化为有序双向链表
- 二叉排序树转化为有序双向链表
- 旋转有序的二分查找
- C# Task 多线程
- 判断字符串是否是回文.时间复杂度
- POI 2002 Skiers
- 实际开发中需要手动改动FPGA 布局布线吗
- Android Studio使用Lint进行代码检查
- 有序链表转化为平衡的二分查找树
- Hibernate各种主键生成策略与配置详解
- 搭建mongodb热备集群 和 c#驱动
- Android View绘制过程
- Android 进程间通信(IPC)---AIDL入门
- MySQL 5.6 for Windows 解压缩版配置安装
- Linux的下c++的编译运行
- MYSQL这则表达式转义要用两个反斜杠,HIVE用四个
- 获取微信、新浪微博等apk签名的方法