235. 二叉搜索树的最近公共祖先
利用二叉线索树的性质2——因为是有序树,所有如果 中间节点是 q 和 p 的公共祖先,那么 中节点的数组 一定是在 [p, q]区间的。即 中节点 > p && 中节点 < q 或者 中节点 > q && 中节点 < p。并且根据分析知:当我们从上向下去递归遍历,第一次遇到 cur节点是数值在[p, q]区间中,那么cur就是 p和q的最近公共祖先。
/**
* 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* search(TreeNode* root, TreeNode* p, TreeNode* q)
{
if(root == NULL)return NULL;
if(root->val > p->val && root->val > q->val)return search(root->left,p,q);
else if(root->val < p->val && root->val < q->val)return search(root->right,p,q);
else return root;
return NULL;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
return search(root, p, q);
}
};
701. 二叉搜索树中的插入操作
我直接写了迭代版本,注意这里需要两个指针一个表示当前节点,一个表示前一个节点比较好写。AC代码:
/**
* 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* insertIntoBST(TreeNode* root, int val) {
// 思路:val大于当前节点就往右走 直到遇到空就加到right
// 小于当前节点就往左走 直到遇到空
TreeNode* head = root;
TreeNode* old = head;
while(head) // 没到叶子
{
old = head;
if(val > head->val)head = head->right;
else if(val < head->val)head = head->left;
}
TreeNode* tmp = new TreeNode(val);
if(root == NULL)return tmp;
if(val > old->val)old->right = tmp;
else if(val < old->val)old->left = tmp;
return root;
}
};
450. 删除二叉搜索树中的节点
以后有空 todo