题目链接:235. 二叉搜索树的最近公共祖先
使用回溯法求解,代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
TreeNode* traversal(TreeNode* root, TreeNode* p, TreeNode* q)
{
if(root==nullptr) return root;
if(root->val>p->val&&root->val>q->val)
{
TreeNode* left=traversal(root->left,p,q);
if(left!=nullptr) return left;
}
if(root->val<p->val&&root->val<q->val)
{
TreeNode* right=traversal(root->right,p,q);
if(left!=nullptr) return right;
}
return root;
}
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
return traversal(root,p,q);
}
};
题目链接:701.二叉搜索树中的插入操作
这道题可以不考虑题目中提示所说的改变树的结构的插入方式,只要按照二叉搜索树的规则去遍历,遇到空节点就插入节点就可以了。
代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val)
{
if(root==nullptr)
{
TreeNode* cur=new TreeNode(val);
return cur;
}
if(root->val>val)
root->left=insertIntoBST(root->left,val);
if(root->val<val)
root->right=insertIntoBST(root->right,val);
return root;
}
};
题目链接:450.删除二叉搜索树中的节点
这道题首先要把二叉搜索树中删除节点遇到的情况都搞清楚。
有以下五种情况:
第一种情况:没找到删除的节点,遍历到空节点直接返回了
找到删除的节点
第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点
第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。
整体代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
if(root==nullptr) return root;
if(root->val==key)
{
if(!root->left&&!root->right)
{
delete root;
return nullptr;
}
else if(!root->left)
{
auto r=root->right;
delete root;
return r;
}
else if(!root->right)
{
auto l=root->left;
delete root;
return l;
}
else
{
TreeNode* cur=root->right;
while(cur->left!=nullptr)
{
cur=cur->left;
}
cur->left=root->left;
TreeNode* tem=root;
root=root->right;
delete tem;
return root;
}
}
if(root->val>key) root->left=deleteNode(root->left,key);
if(root->val<key) root->right=deleteNode(root->right,key);
return root;
}
};