系列文章目录
前言
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。
描述
给定一个升序排序的数组,将其转化为平衡二叉搜索树(BST).
平衡二叉搜索树指树上每个节点 node 都满足左子树中所有节点的的值都小于 node 的值,右子树中所有节点的值都大于 node 的值,并且左右子树的节点数量之差不大于1
例如当输入的升序数组为[-1,0,1,2]时,转化后的平衡二叉搜索树(BST)可以为{1,0,2,-1},如下图所示:
或为{0,-1,1,#,#,#,2},如下图所示:
返回任意一种即可。
题解思路: 与题解一相同,不过将递归转为迭代的写法.依然是分割的思想。
分析: 使用一个栈来保存左右子树边界,一个栈用来保存遍历的节点。
复杂度度分析:
时间复杂度:O(N),遍历整个节点数N
空间复杂度:O(logN)
实现如下:
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& num) {
if(num.size() ==0 ) return NULL;
stack<TreeNode*> node_st; // 用来保存构造的节点
stack<int> lr_index; // 用来保存边界
TreeNode* root = new TreeNode(0); //根节点入栈
node_st.push(root);
lr_index.push(0); // 将左边界入栈
lr_index.push(num.size()-1); // 右边界入栈
while(node_st.size()){
int right = lr_index.top();lr_index.pop(); //取出左边界
int left = lr_index.top();lr_index.pop(); //取出右边界
int mid = (right+left+1)/2; //取中间值作为根节点的值
TreeNode* tmp = node_st.top(); //取出当前节点
node_st.pop();
tmp->val = num[mid]; //将中间值赋予当前节点的值
//划分左子树
if(left<= mid-1){
tmp->left = new TreeNode(0);
node_st.push(tmp->left);
lr_index.push(left);
lr_index.push(mid-1);
}
//划分右子树
if(right>= mid+1){
tmp->right = new TreeNode(0);
node_st.push(tmp->right);
lr_index.push(mid+1); //
lr_index.push(right);
}
}
return root;
}
};