108. 将有序数组转换为二叉搜索树
![在这里插入图片描述](https://img-blog.csdnimg.cn/9e179d4a8f794af18552633812352a5b.png)
class Solution {
public:
TreeNode* traversal(vector<int>& nums, int left, int right)
{
if (left > right) return nullptr;
int mid = left + ((right - left) / 2);
TreeNode* root = new TreeNode(nums[mid]);
root->left = traversal(nums, left, mid - 1);
root->right = traversal(nums, mid + 1, right);
return root;
}
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
TreeNode* root = traversal(nums, 0, nums.size() - 1);
return root;
}
};
![在这里插入图片描述](https://img-blog.csdnimg.cn/548376081fa84dffab4d339c616d92b1.png)
538. 把二叉搜索树转换为累加树
![在这里插入图片描述](https://img-blog.csdnimg.cn/bc677e39582d4ac8861150a90752a73f.png)
class Solution {
private:
int pre;
void traversal(TreeNode* cur)
{
if (cur == nullptr) return;
traversal(cur->right);
cur->val += pre;
pre = cur->val;
traversal(cur->right);
}
public:
TreeNode* convertBST(TreeNode* root) {
pre = 0;
traversal(root);
return root;
}
};
![在这里插入图片描述](https://img-blog.csdnimg.cn/0acb1b7f6573419b97ea632ebfd93cd6.png)
106.从中序与后序遍历序列构造二叉树
![在这里插入图片描述](https://img-blog.csdnimg.cn/899106738dd0454eb8033b7459daa89c.png)
class Solution {
public:
TreeNode* traversal(vector<int>& inorder, vector<int>& postorder) {
if (postorder.size() == 0) return nullptr;
int rootValue = postorder[postorder.size() - 1];
TreeNode* root = new TreeNode(rootValue);
if (postorder.size() == 1) return root;
int del;
for (del = 0; del < inorder.size(); del++)
{
if (inorder[del] == rootValue) break;
}
vector<int> leftInorder(inorder.begin(), inorder.begin() + del);
vector<int> rightInorder(inorder.begin() + del + 1, inorder.end());
postorder.resize(postorder.size() - 1);
vector<int> leftPostorder(postorder.begin(), postorder.begin() + leftInorder.size());
vector<int> rightPostorder(postorder.begin() + leftInorder.size(), postorder.end());
root->left = traversal(leftInorder, leftPostorder);
root->right = traversal(rightInorder, rightPostorder);
return root;
}
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder)
{
if (inorder.size() == 0 || postorder.size() == 0) return nullptr;
return traversal(inorder, postorder);
}
};
![在这里插入图片描述](https://img-blog.csdnimg.cn/4303481b20894d4799b21fbf4b8a26b9.png)
235. 二叉搜索树的最近公共祖先
![在这里插入图片描述](https://img-blog.csdnimg.cn/7a43a39dbc0140159ea163de60984c75.png)
class Solution {
public:
TreeNode* traversal(TreeNode* cur, TreeNode* p, TreeNode* q) {
if (cur == nullptr) return cur;
if (cur->val > p->val && cur->val > q->val)
{
TreeNode* left = traversal(cur->left, p, q);
if (left != nullptr)
{
return left;
}
}
if (cur->val < p->val && cur->val < q->val)
{
TreeNode* right = traversal(cur->right, p, q);
if (right != nullptr)
{
return right;
}
}
return cur;
}
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
return traversal(root, p, q);
}
};
![在这里插入图片描述](https://img-blog.csdnimg.cn/95504f7a9c8c4021b359ea0cbec3c3df.png)