108. 将有序数组转换为二叉搜索树
108. 将有序数组转换为二叉搜索树
给你一个整数数组
nums
,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
示例 1:

输入:nums = [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

示例 2:

输入:nums = [1,3] 输出:[3,1] 解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums
按 严格递增 顺序排列
1 #include <iostream> 2 #include <vector> 3 4 using namespace std; 5 6 /** 7 Definition for a binary tree node. 8 */ 9 struct TreeNode { 10 int val; 11 TreeNode *left; 12 TreeNode *right; 13 TreeNode() : val(0), left(nullptr), right(nullptr) {} 14 TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} 15 TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} 16 }; 17 18 class Solution { 19 public: 20 TreeNode *helper(vector<int> nums, int first, int last) { 21 if (first > last) { 22 return nullptr; 23 } 24 // 到达叶子节点 25 if (first == last) { 26 TreeNode *parrent = new TreeNode(nums[first]); 27 return parrent; 28 } 29 int mid = first + (last - first) / 2; 30 TreeNode *leftChildNode = helper(nums, first, mid - 1); 31 TreeNode *rightChildNode = helper(nums, mid + 1, last); 32 TreeNode *parrent = new TreeNode(nums[mid]); 33 parrent->left = leftChildNode; 34 parrent->right = rightChildNode; 35 return parrent; 36 } 37 TreeNode* sortedArrayToBST(vector<int>& nums) { 38 if (nums.size() == 0) { 39 return nullptr; 40 } 41 if (nums.size() == 1) { 42 TreeNode *parrent = new TreeNode(nums[0]); 43 return parrent; 44 } 45 int first = 0; 46 int last = (int)nums.size() - 1; 47 return helper(nums, first, last); 48 } 49 50 void midOrderPrintTree(TreeNode *root) { 51 if (root == nullptr) { 52 return; 53 } 54 midOrderPrintTree(root->left); 55 cout << root->val << " "; 56 midOrderPrintTree(root->right); 57 return; 58 } 59 void preOrderPrintTree(TreeNode *root) { 60 if (root == nullptr) { 61 return; 62 } 63 cout << root->val << " "; 64 preOrderPrintTree(root->left); 65 preOrderPrintTree(root->right); 66 return; 67 } 68 void postOrderPrintTree(TreeNode *root) { 69 if (root == nullptr) { 70 return; 71 } 72 postOrderPrintTree(root->left); 73 postOrderPrintTree(root->right); 74 cout << root->val << " "; 75 return; 76 } 77 }; 78 int main() 79 { 80 vector<int> nums = {-10, -3, 0, 5, 9}; 81 Solution *test = new Solution(); 82 TreeNode *root = test->sortedArrayToBST(nums); 83 cout << "preOrder print Tree:" << endl; 84 test->preOrderPrintTree(root); 85 cout << endl; 86 87 cout << "midOrder print Tree:" << endl; 88 test->midOrderPrintTree(root); 89 cout << endl; 90 91 cout << "postOrder print Tree:" << endl; 92 test->postOrderPrintTree(root); 93 cout << endl; 94 system("pause"); 95 return 0; 96 }
测试结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理