代码随想录刷题03.05(2)
二叉树相关操作8
LeetCode题目
解题思路
1.本题思路:当在搜索二叉树中遇到一个节点的数值在p和q之间时,说明该节点是最近公共祖先。
2.搜索二叉树的特性:左子树都比父节点要小,右子树都比父节点要大。因此,可以通过目标值与父节点的比较直接获知该继续向哪个方向遍历,对搜索数值比较好用。
3.利用二叉搜索树的特性来遍历找节点:利用大小判断来决定左右传递方向。
4.递归的返回值问题:左右中的返回(比如用一个变量来承接递归函数的返回)值要从操作(终止条件或“中”)中来获得,左右只是负责如何传递数据流。
代码过程
/**
* 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 {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root==nullptr)return root;
if(root->val<p->val&&root->val<q->val){
TreeNode* right=lowestCommonAncestor(root->right,p,q);
if(right!=nullptr)return right;
}
else if(root->val>p->val&&root->val>q->val){
TreeNode* left=lowestCommonAncestor(root->left,p,q);
if(left!=nullptr)return left;
}
else return root;
return root;
}
};
LeetCode题目
解题思路
1.本题思路:在二叉树中插入一个新节点,总能在叶子节点处找到对应的位置。因此,只需要在二叉搜索树中按照大小关系判断传递方向找到对应的合适的叶子节点即可。
2.在二叉树中插入新节点包括两大步骤:
1)定义一个新节点;
2)讲新节点“被指回”上一个节点的左侧或右侧。
3.注意:当递归函数需要返回时,要关注返回的场景:if(或else if语句)里的return返回属于递归函数内的返回,与整体函数仍然需要返回一个值给函数外的变量来用。
代码过程
/**
* 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* newnode=new TreeNode(val);
root=newnode;
return root;
}
if(root->val>val){
root->left=insertIntoBST(root->left,val);
return root;
}
if(root->val<val){
root->right=insertIntoBST(root->right,val);
return root;
}
return root;
}
};
LeetCode题目
解题思路
1.本题思路:本题终止条件需要多次分类讨论——删除节点的类型(根据子树有无情况)可以分为5种情况;
2.递归函数的返回看终止条件或“中”的操作,左右操作只是起数据传递作用;并且,对于局部递归参数(即递归体中定义的参数,其值不会对上一层产生影响)在左右操作的承接参数书写和终止条件或“中”操作的return书写,可以从“一条函数语句分别拆分为两段进行表达”开看。
3.删除二叉树中的节点需要事先定义好一个新的节点地址,承接下一层地址,然后再delete掉当前这个节点,以释放内存。
代码过程
/**
* 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){
TreeNode* node=root;
delete node;
return nullptr;
}
else if(root->left==nullptr&&root->right!=nullptr){
TreeNode* node=root->right;
delete root;
return node;
}
else if(root->left!=nullptr&&root->right==nullptr){
TreeNode* node=root->left;
delete root;
return node;
}
else{
TreeNode*cur=root->right;
while(cur->left!=nullptr)cur=cur->left;
cur->left=root->left;
TreeNode* node=root->right;
delete root;
return node;
}
}
if(root->val>key)root->left=deleteNode(root->left,key);
if(root->val<key)root->right=deleteNode(root->right,key);
return root;
}
};