写递归时要注意返回值,要能够将返回值正确返回。
下面有两个例子
例子1
剑指 Offer 54. 二叉搜索树的第k大节点
给定一棵二叉搜索树,请找出其中第k大的节点。
示例 1:
输入: root = [3,1,4,null,2], k = 1
3
/
1 4
2
输出: 4
示例 2:
输入: root = [5,3,6,2,4,null,null,1], k = 3
5
/
3 6
/
2 4
/
1
输出: 4
使用全局变量将数据保存下来,通过再建立一个函数调用递归函数来解决返回值问题
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int p=0;
int kthLargest(TreeNode* root, int k) {
if(root == NULL){
return 0;
}
kth(root,k);
return p;
}
void kth(TreeNode* root, int &k) {
//设置为void返回值,**并注意此处要用&k才能改变k值要不k值一直不改变**
if(root == NULL){
return ;
}
kth(root->right,k);
k--;
if(k==0){
p=root->val;
return;
}
kth(root->left,k);
}
};
例子2
- 二叉搜索树的范围和
给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和。
示例 1:
输入:root = [10,5,15,3,7,null,18], low = 7, high = 15
输出:32
示例 2:
输入:root = [10,5,15,3,7,13,18,1,null,6], low = 6, high = 10
输出:23
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int rangeSumBST(TreeNode* root, int low, int high) {
if(root==nullptr){
return 0;
}
int k=root->val;
if(k<low){
return rangeSumBST(root->right,low,high);
}
if(k>high){
return rangeSumBST(root->left,low,high);
}
return rangeSumBST(root->right,low,high)+rangeSumBST(root->left,low,high)+k;
}
};
直接返回函数的返回值,由题得为相加,故最后将返回值相加
本题的解题思路可以看下面的图解,很清晰