题目
Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
分析
- 对于一组已知长度的数据来说,建立一个height balance BTS,这个平衡二叉树的高度是可以计算得出来,并且唯一的。区别在于非完全二叉树情况下,叶子结点位置可以不唯一,因此解有多个,不妨另叶子节点均靠近左侧。
- 如果二叉树已经建立好,数据已经插入,则可以借助树的中序遍历方法实现得到一组排好序的数据。
- 根据第二点,可以建立一个二叉树,采用中序遍历的方式为二叉树插值,这样得到的结果就是题目的答案了。这里分两步走。
- 最佳的方式应当是建立二叉树的同时,插入数据。
fisrt coding
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
/**
* Definition for binary tree
* 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;
else if (!head->next)
return new TreeNode(head->val);
int listLength = 0;
ListNode* temp = head;
while(temp) {
listLength++;
temp = temp->next;
}
ListNode* headCopy = head;
TreeNode* root = buildBST(listLength);
midSearch(root, &headCopy);
return root;
}
TreeNode* buildBST(int count) {
if (count <= 0)
return NULL;
TreeNode* root = new TreeNode(0);
queue<TreeNode*> queueTree;
queueTree.push(root);
int index = 0;
while (!queueTree.empty()) {
TreeNode* temp = queueTree.front();
queueTree.pop();
index++;
if (index * 2 < count) {
temp->left = new TreeNode(0);
temp->right = new TreeNode(0);
queueTree.push(temp->left);
queueTree.push(temp->right);
} else if (index * 2 == count) {
temp->left = new TreeNode(0);
queueTree.push(temp->left);
} else {
break;
}
}
return root;
}
void midSearch(TreeNode* root, ListNode** listNode) {
if (root->left)
midSearch(root->left, listNode);
//dosomething
root->val = (*listNode)->val;
*listNode = (*listNode)->next;
if (root->right)
midSearch(root->right, listNode);
}
};
以上代码没获得AC,原因:平衡二叉树是建立了,但是并没有heght balanced.没有仔细考虑这一点。
测试用例:
{-10,-3,0,5,9}
对应输出应该为:
{0,-3,9,-10,#,5}
你的输出为:
{5,-3,9,-10,0}