[Бинарное дерево поиска] leetcode98: Проверка двоичных сортировок дерева (средний)

Предупреждение: Данная статья является блоггером оригинальной статьи, следовать CC 4.0 BY-SA авторского соглашения, воспроизведенный, пожалуйста , приложите ссылку первоисточника и это утверждение.
Эта ссылка: https://blog.csdn.net/qq_43152052/article/details/100165146

тема:
Здесь Insert Picture Описание

Решение:

Бинарное дерево поиска, также известное как бинарный родом дерево, природа выглядит следующим образом :
1) Если оставить поддерево этого дерева не пусто, тоЗначение всех узлов в левом поддереве должно быть меньше, чем значение его корня
2) Если правое поддерево этого дерева не является пустым, тоЗначения всех узлов правого поддерева должны быть больше, чем значение его корня
3) его левые и правые поддерева также бинарное дерево рода

Для пути мы используем рекуррентное решение проблем, более глубокое понимание рекурсии, здесь мы рекурсия в стеке (конечно рекурсивный вызов действительно стек система), первое рекурсивное левое поддерево всех узлов в стек до встречает узел листа. Поверхность листового узла, мы должны возвращаться назад рекурсивной, то есть, верхний элемент в стек, знач указывает на верхний элемент, а затем поп верхний стек элемент, VAL по сравнению с этим временем верхнего элемента (этот верхний элемент может представлять собой родительский узел, это может быть правильный дочерний узел на узле), если это родительский узел, а затем, на который указывает значение, вал, чтобы быть меньше, чем значение родительского узла, если брат, а затем, на который указывает вал значение меньше, чем значение правого дочернего узла, в противном случае это не бинарное дерево рода. Когда, наконец, обратно к корневому узлу, то есть, когда верхний элемент является корневым узлом, то все узлы в его правом поддереве должны быть больше, чем значение корневого узла, если меньше, чем значение корневого узла, то это не бинарное дерево рода. Вся идея рекурсии так, я до сих пор не понимаю, что вы можете сделать свое собственное ясное мышление.

Код выглядит следующим образом:

class Solution {
public:
    int *val=nullptr;
    bool isValidBST(TreeNode* root) {
        //到达叶子节点返回true
        if(root==nullptr)
            return true;
        else
        {
            //左子树不是排序二叉树,则直接返回false
            if(!isValidBST(root->left))return false;
            
            //将递归看成压栈,val表示的就是指向栈顶元素的值
            //左子树的所有节点压入完成时,开始进行弹栈,val(实际意义:表示的是下层的左节点值)都要小于上一层的根节点值,每次val更新到上一层的根节点值(左子树的根节点)(由下到上)
            //左子树弹栈到最初的root时,那么开始将右子树的节点值压入栈中,val(实际意义:表示上层的右子树根节点值)都要小于下一层的右节点的值,每次比较完更新val的值为下一层的右节点值(由上到下)
            if(val!=nullptr&&*val>=root->val)return false;
            val=&root->val;//更新val的值
            
            //右子树不是排序二叉树,则直接返回false
            if(!isValidBST(root->right))return false;
            return true;
        }
    }
};

рекомендация

отblog.csdn.net/qq_43152052/article/details/100165146