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 }
复制代码

测试结果:

 

 

posted @   跳动的休止符  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示