前言
LeetCode题目:LeetCode 235、701、450
Takeaway:今天的题目仍然都是递归+回溯+二叉搜索树,但是对二叉搜索树的讨论更消息了,要学会什么时候是遍历一条边,什么时候遍历整棵树!
一、235
二叉搜索树的应用。
/**
* 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* traverse(TreeNode* root, TreeNode* p, TreeNode* q) {
if (root == NULL)
return root;
// 当前节点比两个值都小,该找更大的右子树
if(root->val<p->val && root->val<q->val){
TreeNode* right = traverse(root->right, p, q);
if (right != NULL) {
return right;
}
}
// 当前节点比两个值都大,该找更小的左子树
if(root->val>p->val && root->val>q->val){
TreeNode* left = traverse(root->left, p, q);
if (left != NULL) {
return left;
}
}
// 当前节点大小位于两个之间,是祖先
return root;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
TreeNode* ans = traverse(root, p, q);
return ans;
}
};
二、701
看起来难,实则简单,因为并不需要更改树的结构,找到为null的位置插入就行。
/**
* 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* pre;
void Traverse(TreeNode* root, int val){
if(root == NULL){
TreeNode* cur = new TreeNode(val);
if(pre->val > val){
pre->left = cur;
}else{
pre->right = cur;
}
return;
}
pre = root;
if(root->val > val){
Traverse(root->left, val);
}
if(root->val < val){
Traverse(root->right, val);
}
}
TreeNode* insertIntoBST(TreeNode* root, int val) {
if(root == NULL){
TreeNode* cur = new TreeNode(val);
return cur;
}
Traverse(root, val);
return root;
}
};
三、450
这题就是删除节点,要分类讨论,什么时候更改树结构。
/**
* 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 == NULL){
return root;
}
if(root->val == key){
if(root->left==NULL && root->right==NULL){
return NULL;
}else if(root->left==NULL){
return root->right;
}else if(root->right==NULL){
return root->left;
}else if(root->left!=NULL && root->right!=NULL){
TreeNode* leftChild = root->left;
TreeNode* rightChild = root->right;
TreeNode* newLeft = rightChild;
while(newLeft->left!=NULL){
newLeft = newLeft->left;
}
newLeft->left = leftChild;
return rightChild;
}
}
if(root->val > key){
root->left = deleteNode(root->left, key);
}
if(root->val < key){
root->right = deleteNode(root->right, key);
}
return root;
}
};
总结
今天的题目仍然都是递归+回溯+二叉搜索树,但是对二叉搜索树的讨论更消息了,要学会什么时候是遍历一条边,什么时候遍历整棵树!