- 1、验证二叉搜索树(medium)">1、验证二叉搜索树(medium)
- 235. 二叉搜索树最近的公共祖先">235. 二叉搜索树最近的公共祖先
- 更多算法题训练:
二叉树:每个节点最多有两个子树,这两个子树有左右之分,次序不可颠倒。
前序遍历:先访问自己,再访问左子树,最后右子树
中序遍历:先访问左子树,再访问自己,最后右子树
后序遍历:先访问左子树,再访问右子树,最后自己
图:1.深搜 2.广搜
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL){}
}
1、验证二叉搜索树(medium)
- 递归解决,进行左子树搜索时,有上界,进行右子树解决时,有下界
class Solution {
public:
bool helper(TreeNode* root, long long lower, long long upper) {
if (root == nullptr) return true;
if (root -> val <= lower || root -> val >= upper) return false;
return helper(root -> left, lower, root -> val) && helper(root -> right, root -> val, upper);
}
bool isValidBST(TreeNode* root) {
return helper(root, LONG_MIN, LONG_MAX);
}
};
235. 二叉搜索树最近的公共祖先
从根节点开始遍历树
- 如果节点 p 和节点 q 都在右子树上,那么以右子树为根节点继续 1 的操作
- 如果节点 p 和节点 q 都在左子树上,那么以左子树为根节点继续 1 的操作
- 如果条件 2 和条件 3 都不成立,这就意味着我们已经找到节 p 和节点 q 的 LCA 了
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
int parentval = root->val;
int pval =p->val;
int qval =q->val;
if(pval>parentval&&qval>parentval)
{
return lowestCommonAncestor(root->right,p,q);
}
else if(pval<parentval&&qval<parentval)
{
return lowestCommonAncestor(root->left,p,q);
}
else
{
return root;
}
}
};
更多算法题训练:
- 路径之和,求所有从跟节点到叶节点路径之和为sum的组合 —->113(Medium)
- 最近的公共祖先,给两个节点,求公共祖先,越深越好 —->236(Medium)
- 二叉树转链表,给定一个二叉树,原地将它展开为链表。 —->114(Medium)
- 二叉树的右视图。返回右侧能看到的节点值 —->199(Medium)
- 课程安排。有依赖关系 —->207(Medium)