东莞长安做网站网址收录大全
文档讲解:
BST,各种插入删除操作
235.二叉搜索树的最近公共祖先
思路:昨天练习了二叉树的搜索,今天这道题是二叉搜索树的搜索,其具有有序这个特点,其能决定我们每次搜索是进入该节点的左子树还是右子树,而且其具有一个特点,一旦要搜索的节点p和节点q不存在同一个子树中,那么此时的root一定是他们两个的最近公共祖先!
时间复杂度:O(n)
空间复杂度:O(n)
class Solution {
public:TreeNode* traversal(TreeNode* root,TreeNode* p,TreeNode* q){if(root==nullptr)return root;//只要p和q分别存在于该root的两棵子树中的时候,就可以返回了if(root->val>p->val&&root->val>q->val){TreeNode* lefttree=traversal(root->left,p,q);//出栈,回到最上面一层if(lefttree!=nullptr){return lefttree;}}if(root->val<p->val&&root->val<q->val){TreeNode* righttree=traversal(root->right,p,q);if(righttree!=nullptr){return righttree;}}return root;}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {return traversal(root,p,q);}
};
701.二叉搜索树中的插入操作
思路:其实这道题看起来复杂,做起来容易,就是无论如何,我们都将要插入的节点,插入到最后一个位置,每次只需要比较其比根节点大还是小,放在左子树还是右子树!
时间复杂度:O(n)
空间复杂度:O(n)
class Solution {
public:TreeNode* traversal(TreeNode* root,int val){if(root==nullptr){TreeNode* node=new TreeNode(val);return node;}if(val<root->val){root->left=traversal(root->left,val);}if(val>root->val){root->right=traversal(root->right,val);}return root;}TreeNode* insertIntoBST(TreeNode* root, int val) {return traversal(root,val);}
};
450.删除二叉搜索树中的节点
思路:这里的调整树的结构还得学习一下!
时间复杂度:O(n)
空间复杂度:O(n)
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;}if(root->left==nullptr&&root->right){TreeNode* temp=root;root=root->right;delete temp;return root;}else if(root->left&&root->right==nullptr){TreeNode* temp=root;root=root->left;delete temp;return root;}else{TreeNode* cur=root->right;while(cur->left!=nullptr){cur=cur->left;}cur->left=root->left;TreeNode* temp=root;root=root->right;delete temp;temp=nullptr;}}if(root->val>key)root->left=deleteNode(root->left,key);if(root->val<key)root->right=deleteNode(root->right,key);return root;}
};