235.二叉搜索树的最近公共祖先
题目链接https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree
思路就是因为是搜索树,所以如果要找的pq的值在节点的左边,那就遍历左子树,pq值在节点右边就遍历右子树,除了这两种情况,剩下的就是在pq值的中间(不论p更大还是q更大),那我从上往下遍历得到的第一个在他们的值中间的结点那就是最近公共祖先了,就直接把该root返回
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root==NULL)return NULL;//终止条件
if(p->val<root->val&&p->val<root->val){//左
TreeNode* left=lowestCommonAncestor(root->left, p, q);
return left;}
if(p->val>root->val&&p->val>root->val){//右
TreeNode* right=lowestCommonAncestor(root->right, p, q);
return right;}
return root;
}
};
701.二叉树的插入操作
题目链接https://leetcode.cn/problems/insert-into-a-binary-search-tree
这里的思路应该把结点插到叶子结点上的左指针或者右指针就行,只要插入的值比节点小就往左遍历,比节点大就往右遍历,遍历到该插入的位置,也就是终止条件是root==NULL的时候就把这个插入的指针往上返回,那我们要把上一个结点的指向这个新插入的指针。
class Solution {//正确代码
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
TreeNode* node;
if (root == NULL) {//终止条件
node = new TreeNode(val);
return node;
}
if (val < root->val) {
TreeNode* left = insertIntoBST(root->left, val);
root->left = left;//上一个节点指向新创建的节点的值
}
if (val > root->val) {
TreeNode* right = insertIntoBST(root->right, val);
root->right = right;
}
return root;//返回根节点
}
};
最开始一直没想明白为什么这串代码是报错的,后来发现这里的left是保存的新加进来的结点,那我要让上一个节点指向这个节点的话应该是root->left=left,但是我这里写的是root->left=node,那在这个条件里面node是没有值的,也就是node可能还是空值,所以会加了个空节点上去!!(怪不得报错代码里面就是少了一个值)
TreeNode* insertIntoBST(TreeNode* root, int val) {//错误代码
TreeNode* node;
if (root == NULL) {
node = new TreeNode(val);
return node;
}
if (val < root->val) {
TreeNode* left = insertIntoBST(root->left, val);
root->left = node;//node为空,会加入空节点进来
}
if (val > root->val) {
TreeNode* right = insertIntoBST(root->right, val);
root->right = node;//node为空,会加入空节点进来
}
return root;
405.删除二叉树中的结点
题目链接 https://leetcode.cn/problems/delete-node-in-a-bst
class Solution {
public:
TreeNode*pre=nullptr;
TreeNode* deleteNode(TreeNode* root, int key) {
if(root==nullptr) return nullptr;//说明没找到,返回空
else if(root->val==key){
if(root->left==nullptr&&root->right==nullptr){//叶子结点,直接删
delete root;
return nullptr;
}
else if(root->left==nullptr){//左空右不空,返回root的右节点
pre=root->right;
delete root;
return pre;
}
else if(root->right==nullptr){//右空左不空,返回root的左节点
pre=root->left;
delete root;
return pre;
}
else{
pre=root->right;//把右结点作为新的root
while(pre->left!=nullptr){
pre=pre->left;
}
pre->left=root->left;//把root的左子树连到新节点上
delete root;
return pre;
}
}
if(key<root->val) root->left=deleteNode(root->left,key);//遍历左子树
if(key>root->val) root->right=deleteNode(root->right,key);//遍历右子树
return root;
}
};