1008. 前序遍历构造二叉搜索树

1008. 前序遍历构造二叉搜索树

给定一个整数数组,它表示BST(即 二叉搜索树 )的 先序遍历 ,构造树并返回其根。

保证 对于给定的测试用例,总是有可能找到具有给定需求的二叉搜索树。

二叉搜索树 是一棵二叉树,其中每个节点, Node.left 的任何后代的值 严格小于 Node.val , Node.right 的任何后代的值 严格大于 Node.val

二叉树的 前序遍历 首先显示节点的值,然后遍历Node.left,最后遍历Node.right

 

示例 1:

输入:preorder = [8,5,1,7,10,12]
输出:[8,5,10,1,7,null,12]

示例 2:

输入: preorder = [1,3]
输出: [1,null,3]

 

提示:

  • 1 <= preorder.length <= 100
  • 1 <= preorder[i] <= 10^8
  • preorder 中的值 互不相同
 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 8  *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 9  *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10  * };
11  */
12 class Solution {
13 public:
14     void insertNode(TreeNode *root, int val) {
15         if (root->val > val) { // 节点插入到左子树
16             if (root->left == nullptr ) {
17                 // 左子树为空直接插入节点
18                 root->left = new TreeNode(val);
19             } else {
20                 insertNode(root->left, val);
21             }
22         } else { // 节点插入到右子树
23             if (root->right == nullptr) {
24                 root->right = new TreeNode(val);
25             } else {
26                 insertNode(root->right, val);
27             }
28         }
29         return;
30     }
31     TreeNode* bstFromPreorder(vector<int>& preorder) {
32         if (preorder.empty()) {
33             return nullptr;
34         }
35         TreeNode *root = new TreeNode(preorder[0]);
36         for (unsigned int i = 1; i < preorder.size(); i++) {
37             insertNode(root, preorder[i]); // 递归插入节点
38         }
39         return root;
40     }
41 };

 

 

posted @ 2022-03-31 00:40  跳动的休止符  阅读(42)  评论(0)    收藏  举报