530 二叉搜索树的最小绝对差
思路:代码随想录
思路:中序遍历树,放入数组。再循环遍历数组 找到最小值。
501 二叉搜索树的众数
思路:代码随想录
思路:使用双指针思想。
弄一个指针指向前一个节点,这样每次cur(当前节点)才能和pre(前一个节点)作比较。
而且初始化的时候pre = NULL,这样当pre为NULL时候,我们就知道这是比较的第一个元素。
代码如下:
if (pre == NULL) { // 第一个节点
count = 1; // 频率为1
} else if (pre->val == cur->val) { // 与前一个节点数值相同
count++;
} else { // 与前一个节点数值不同
count = 1;
}
pre = cur; // 更新上一个节点
我们只需要遍历一遍就可以找到最大频率:
如果频率等于最大频率 就把元素的值放进数组。如果当前元素出现的频率大于最大频率:更新最大频率,再清空数组,再把当前元素的值放入数组 。
235.二叉树最近公共祖先
思路:代码随想录
思路:后序遍历 自底向上返回。首先最容易想到的一个情况:如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。情况二:节点本身就可以成为祖先。
那么我们来说一说,如果 root == q,或者 root == p,说明找到 q p ,则将其返回,这个返回值,后面在中节点的处理过程中会用到,那么中节点的处理逻辑,下面讲解。
代码如下:
if (root == q || root == p || root == NULL) return root;
此题需要遍历整棵树,因为我们需要left 和 right 来处理 中的逻辑:
left = 递归函数(root->left); // 左
right = 递归函数(root->right); // 右
left与right的逻辑处理;
最后:
如果left 和 right都不为空,说明此时root就是最近公共节点。这个比较好理解
如果left为空,right不为空,就返回right,说明目标节点是通过right返回的,反之依然。