二叉搜索树求最近公共祖先
题目理解
二叉搜索树是有序的,如果是左中右排的话,只要在有序数组中查找两数之间的根节点就可以了。不需要遍历整棵树,找到就可以。
代码块
class Solution {
public:TreeNode* traversal(TreeNode* curr, TreeNode* p, TreeNode* q) {if (curr == NULL)return curr;if (curr->val > p->val && curr->val > q->val) {TreeNode* left = traversal(curr->left, p, q);if (left != NULL)return left;}if (curr->val < p->val && curr->val < q->val) {TreeNode* right = traversal(curr->right, p, q);if (right != NULL)return right;}return curr; }TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if (root == NULL)return root;return traversal(root, p, q);}
};
二叉搜索树中的插入操作
题目理解
在已知的一个二叉搜索树中插入一个节点,使插入操作之后该树依然是二叉搜索树。
思路
代码
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;}
};
二叉搜索树中的删除操作
代码
class Solution {
public:TreeNode* deleteNode(TreeNode* root, int key) {if(root==NULL) return root;if(root->val==key){if(root->left==NULL&&root->right==NULL) return NULL;if(root->left!=NULL&&root->right==NULL) return root->left;if(root->left==NULL&&root->right!=NULL) return root->right;else{TreeNode* curr=root->right;while(curr->left!=NULL) {curr=curr->left;}curr->left = root->left;TreeNode*tmp=root;root =root->right;tmp->left=curr->left;delete tmp;return root;}}if(root->val>key) root->left=deleteNode(root->left,key);if(root->val<key) root->right=deleteNode(root->right,key);return root;}
};