701 二叉搜索树中的插入操作
插入操作 我们只用找到末尾的节点就可以插入元素 根据插入元素的大小和二叉搜索树的性质 判断往左子树去还是右子树去 当节点为空时 就可以以val值新建立个节点
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
if(root==nullptr){
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没有找到要删除的节点 直接返回root 2如果该节点的左右孩子都为空 就直接删除delete 然后返回空 3如果要删除的节点左孩子为空 右孩子存在 就直接返回右孩子 4同理右孩子为空 左孩子存在 5左右孩子都存在 统一返回右孩子 但是要先找到右孩子的最左边的左孩子在它后面接上要删除节点的左孩子 后面分别接住返回的左右孩子
if (root->val > key) root->left = deleteNode(root->left, key);
if (root->val < key) root->right = deleteNode(root->right, key);
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
if(root==nullptr) return root;
if(root->val==key){
if(root->left==nullptr && root->right==nullptr){
delete root;
return nullptr;
}else if(root->left==nullptr){
auto node = root->right;
delete root;
return node;
}else if(root->right==nullptr){
auto node = root->left;
delete root;
return node;
}else{
TreeNode* cur = root->right;
while(cur->left!=nullptr){
cur=cur->left;
}
cur->left = root->left;
auto 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;
}
};
108 将有序数组转换为二叉搜索树
思路简单 一半一半的添加 最中间的作为根节点 左边区间作为左子树 右边作为右子树 一直进行这样的操作
class Solution {
public:
TreeNode* traversal(vector<int>& nums,int left, int right){
if(left > right) return nullptr;
int mid = (left+right)/2;
TreeNode* root = new TreeNode(nums[mid]);
root->left = traversal(nums,left,mid-1);
root->right = traversal(nums,mid+1,right);
return root;
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
TreeNode* root = traversal(nums,0,nums.size()-1);
return root;
}
};
538 把二叉搜索树转换为累加树
这道题是从最右侧节点开始相加 所以我们可以用双指针法 先一直向右孩子遍历 然后遇到空开始加上pre节点 然后向上回溯 然后遍历左子树 采用右中左的顺序
class Solution {
public:
int pre = 0;
void traversal(TreeNode* cur){
if(cur==nullptr) return ;
traversal(cur->right);
cur->val+=pre;
pre = cur->val;
traversal(cur->left);
}
TreeNode* convertBST(TreeNode* root) {
traversal(root);
return root;
}
};
总结
二叉树章节终于结束了 到时候自己重写代码的时候估计又要老实了