确定函数返回值类型及参数:由于为int类型,可以设置函数类型为int(答案将其设置为void改全局变量,这里int其实也没有实际用到)
确定终止条件:当遍历到空结点返回。
确定单层递归逻辑:和前面一样,记录前一个结点值,然后通过对比求出最小值。
前面直接是使用left的值导致报错栈溢出
class Solution {
public:
TreeNode* pre=NULL;
int minval=INT_MAX;
int getmin(TreeNode* root){
if(root==NULL)return minval;
int left=getmin(root->left);
if(pre&&((root->val-pre->val)val-pre->val;
}
pre=root;
int right=getmin(root->right);
return minval;
}
int getMinimumDifference(TreeNode* root) {
return getmin(root);
}
};
确定函数参数以及返回值:根据题目意思首先想到vector类型,但是每次递归终止的时候不好返回,可以使用void类型的,参数为结点。
确定终止条件:为空结点时返回。
确定单层递归逻辑:可以参考前面一题一样设置一个双指针,如果pre指针为空,表示在最底层,此时可以将数字出现次数count计为1,然后由于是二叉搜索树,左中右都存在数值关系,可以判断pre指针值与当前根结点的值是否相等,如果相等,统计次数相加。
小技巧:正常思路是先找出最大count然后再遍历一遍找出出现次数为maxcount的数放入容器内,可以不必,只需要出现次数大于最大出现次数时,将原先容器情况重新加入即可。
class Solution {
public:
int count=0;
int maxcount=0;
vector res;
TreeNode* pre=NULL;
void traversal(TreeNode* root){
if(!root)return;
traversal(root->left);
if(pre==NULL)count=1;
else if(pre->val==root->val)count++;
else count=1;
if(count==maxcount)res.push_back(root->val);
if(count>maxcount){
maxcount=count;
res.clear();
res.push_back(root->val);
}
pre=root;
traversal(root->right);
}
vector findMode(TreeNode* root) {
traversal(root);
return res;
}
};
确定函数循环条件以及返回值:如果是需要递归函数返回值,来告诉我们是否找到节点q或者p,那么返回值为bool类型就可以了。但我们还要返回最近公共节点,可以利用上题目中返回值是TreeNode * ,那么如果遇到p或者q,就把q或者p返回,返回值不为空,就说明找到了q或者p。
确定函数终止条件:遇到空的话,因为树都是空了,所以返回空。那么我们来说一说,如果 root == q,或者 root == p,说明找到 q p ,则将其返回,为后续左右结点接住pq结点值做铺垫。
确定单层递归逻辑:由于本题需要从叶子结点到根节点的过程,使用后序遍历。将得到的左右处理逻辑进行 判断,在递归函数有返回值的情况下:如果要搜索一条边,递归函数返回值不为空的时候,立刻返回,如果搜索整个树,直接用一个变量left、right接住返回值,这个left、right后序还有逻辑处理的需要,也就是后序遍历中处理中间节点的逻辑(也是回溯)。
如果找到了公共祖先,一路返回即可。
如果left 和 right都不为空,说明此时root就是最近公共节点。这个比较好理解
如果left为空,right不为空,就返回right,说明目标节点是通过right返回的,反之依然。
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == q || root == p ||root==NULL)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 left;
else if(!left&&right)return right;
else return NULL;
}
};