235.二叉搜索树的最近公共祖先 题目链接
思路
二叉搜索树是有序的,所以祖先一定在q和p之间,并且越靠近根节点,深度越大,所以根本不用遍历完,就可以找到最近公共祖先
解题方法
因为,不需要处理中间节点,所以哪种遍历顺序都可以
Code
/**
* 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*cur,TreeNode*p,TreeNode*q)
{
if(cur==NULL)return cur;
if(cur->val>q->val&&cur->val>p->val)
{
TreeNode*left=traversal(cur->left,p,q);
if(left!=NULL)return left;
}
if(cur->val<q->val&&cur->val<p->val)
{
TreeNode*right=traversal(cur->right,p,q);
if(right!=NULL)return right;
}
return cur;
}
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
return traversal(root,p,q);
}
};
701.二叉搜索树中的插入操作 题目链接
思路
二叉搜索树的节点值有规律可循,所以不用改变树的结构
解题方法
遍历到叶子结点,就把节点插进去
Code
/**
* 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==NULL)
{
TreeNode*node=new TreeNode(val);
return node;
}
if(root->val>val)root->left=insertIntoBST(root->left,val);
if(root->val<val)root->right=insertIntoBST(root->right,val);
return root;
}
};
450.删除二叉搜索树中的节点 题目链接
思路
当节点值等于目标值时,分5种情况讨论:
1.节点为空。
2.节点左右孩子都为空时
3.节点左孩子为空,右不为空。
4.节点右孩子为空,左不为空。
5.节点左右孩子都不为空。
解题方法
第一种情况:直接返回空。
第二种情况:删除节点后,直接返回空。
第三种情况:删除节点后,直接返回节点的右子树。
第四种情况:删除节点后,直接返回节点的左子树。
第五种情况:将要删除的节点的左子树的根节点连接到删除节点的右子树的最左侧的叶子结点,因为该叶子节点是最接近删除节点大小的。
如果节点值不等于目标值:
若节点值<目标值,就向右遍历,用root->right接住,然后递归。
若节点值>目标值,就向左遍历,用root->left接住,然后递归。
Code
/**
* 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 nullptr;
if(root->val==key)
{
if(root->left==nullptr&&root->right==nullptr)
{
delete root;
return nullptr;
}
else if(root->left!=nullptr&&root->right==nullptr)
{
auto retNode=root->left;
delete root;
return retNode;
}
else if(root->right!=nullptr&&root->left==nullptr)
{
auto retNode=root->right;
delete root;
return retNode;
}
else {
TreeNode*cur=root->right;
while(cur->left)
{
cur=cur->left;
}
cur->left=root->left;
TreeNode*tmp=root;
root=root->right;
delete tmp;
return root;
}
}
if(key<root->val)
{
root->left=deleteNode(root->left,key);
}
if(key>root->val)
{
root->right=deleteNode(root->right,key);
}
return root;
}
};