235.二叉搜索树的最近公共祖先
//需理解二叉搜索树和普通二叉树的不同,其左右子树是有序的,从上到下遍历第一次遇到cur->val在p,q之间即为最近公共祖先
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(root == nullptr) return nullptr;if(root->val > p->val && root->val > q->val){return lowestCommonAncestor(root->left, p, q);}else if (root->val < p->val && root->val < q->val){return lowestCommonAncestor(root->right, p, q);}else{return root;}}
701.二叉搜索树中的插入操作
void traverse(TreeNode* root, int val){if(root == nullptr) {return;}if(root->left == nullptr && root->right == nullptr){if(root->val > val){root->left = new TreeNode(val);}else{root->right = new TreeNode(val);}return;}else if( root->left == nullptr && root->right != nullptr){if(root->val > val){root->left = new TreeNode(val);return;}else{return traverse(root->right, val);}}else if (root->left != nullptr && root->right == nullptr){if(root->val < val){root->right = new TreeNode(val);return;}return traverse(root->left, val);}else{if(root->val > val){return traverse(root->left, val);}else{return traverse(root->right, val);}}}TreeNode* insertIntoBST(TreeNode* root, int val) {if(root == nullptr) {root = new TreeNode(val);return root;}else{traverse(root, val);return root;}}
//简答写法,便于理解
TreeNode* insertIntoBST(TreeNode* root, int val) {if(root == nullptr) {root = new TreeNode(val);return root;}if(root->val > val) root->left = insertIntoBST(root->left, val);if(root->val < val) root->right = insertIntoBST(root->right, val);return root;}
450.删除二叉搜索树中的节点,需二刷
//注意搜索树和搜索边的区别及用法,还有删除节点时左子树的位置变化
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 && root->right == nullptr){root = root->left;return root;}else if(root->left == nullptr && root->right!= nullptr){root = root->right;return root;}else{TreeNode* cur = root->right;while(cur->left){cur = cur->left;}cur->left = root->left;root = root->right;return root;}}if(root->val > key) root->left = deleteNode(root->left, key);if(root->val < key) root->right = deleteNode(root->right, key);return root;}