530.二叉搜索树的最小绝对差
题解
int minValue = INT_MAX;
TreeNode *pre = nullptr;
void search(TreeNode* cur) {
if (!cur) return;
search(cur->left);
if (pre) {
minValue = min(minValue, abs(cur->val - pre->val));
}
pre = cur;
search(cur->right);
}
int getMinimumDifference(TreeNode* root) {
search(root);
return minValue;
}
总结
二叉树中的双指针,中序遍历时,cur用于中序遍历,pre指向中序序列中cur的前驱,最小绝对差一定是中序序列中相邻元素的差值。
501.二叉搜索树中的众数
题解
int maxCount = 0;
int count = 0;
vector<int> Mode;
TreeNode *pre = nullptr;
void searchMode(TreeNode *cur) {
if (!cur) return;
searchMode(cur->left);
if (!pre) {
count = 1;
} else if (pre->val == cur->val) {
count++;
} else {
count = 1;
}
pre = cur;
if (count == maxCount) {
Mode.push_back(cur->val);
} else if (count > maxCount) {
maxCount = count;
Mode.clear();
Mode.push_back(cur->val);
}
searchMode(cur->right);
}
vector<int> findMode(TreeNode* root) {
searchMode(root);
return Mode;
}
总结
本题除了双指针中序遍历二叉树外,要关注count和maxCount的作用,count记录中序遍历到当前时相等元素的个数,而要让maxCount为整颗树中最大的相等元素个数。
236.二叉树最近的公共祖先
题解
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (root == nullptr) return nullptr;
if (root == p || root == q) return root;
TreeNode *left = lowestCommonAncestor(root->left, p, q);
TreeNode *right = lowestCommonAncestor(root->right, p, q);
if (left && right) return root;
else if(!left && right) return right;
else if (left && !right) return left;
else return nullptr;
}
总结
采用后序遍历,从下往上回溯,查找当前节点的左子树是否含有p或q,查找当前节点的右子树是否含有p或q,如果左右子树都能查到目标节点,则当前节点即为最近公共节点。