递归在二叉树搜索中的使用

/**

* 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:

bool evaluateTree(TreeNode* root) {

if(root->left==nullptr) return root->val==0?false:true;

bool left=evaluateTree(root->left);

bool right=evaluateTree(root->right);

return root->val==2?left|right:left&right;

}

};

/**

* 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 sumNumbers(TreeNode* root) {

return dfs(root,0);

}

int dfs(TreeNode* root,int m)

{

m=m*10+root->val;

if(root->left==nullptr&&root->right==nullptr) return m;

int ret=0;

if(root->left) ret+=dfs(root->left,m);

if(root->right) ret+=dfs(root->right,m);

return ret;

}

};

/**

* 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:

TreeNode* pruneTree(TreeNode* root) {

if(root==nullptr) return nullptr;

root->left=pruneTree(root->left);

root->right=pruneTree(root->right);

if(root->left==nullptr&&root->right==nullptr&&root->val==0){

//delete root;

root=nullptr;

}

return root;

}

};

我们来补充一下tuple和memset的用法:

tuple:

用于三个元素的容器,用get<>(名称)来进行索引

memset;

用于将数据清零

**

* 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:

long prev=LONG_MIN;

bool isValidBST(TreeNode* root) {

if(root==nullptr) return true;

bool left=isValidBST(root->left);

if(left==false) return false;

bool cur=false;

if(root->val>prev) cur=true;

if(cur==false) return false;

prev=root->val;

bool right=isValidBST(root->right);

return left&&right&&cur;

}

};

/**

* 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 count;

int ret;

int kthSmallest(TreeNode* root, int k) {

count=k;

dfs(root);

return ret;

}

void dfs(TreeNode* root){

if(root==nullptr||count==0) return;

dfs(root->left);

count--;

if(count==0) ret=root->val;

dfs(root->right);

}

};

/**

* 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:

vector<string> ret;

vector<string> binaryTreePaths(TreeNode* root) {

if(root==nullptr) return ret;

string path;

dfs(root,path);

return ret;

}

void dfs(TreeNode* root,string path){

path+=to_string(root->val);

if(root->left==nullptr&&root->right==nullptr){

ret.push_back(path);

}

path+="->";

if(root->left) dfs(root->left,path);

if(root->right) dfs(root->right,path);

}

};

class Solution {

public:

vector<vector<int>> ret;

vector<int> path;

bool vis7;

vector<vector<int>> permute(vector<int>& nums) {

dfs(nums);

return ret;

}

void dfs(vector<int>&nums){

if(path.size()==nums.size()){

ret.push_back(path);

return;

}

for(int i=0;i<nums.size();i++){

if(!visi) {

path.push_back(numsi);

visi=true;

dfs(nums);

path.pop_back();

visi=false;

}

}

}

};

8.

class Solution {

vector<vector<int>> ret;

vector<int> path;

public:

vector<vector<int>> subsets(vector<int>& nums) {

dfs(nums,0);

return ret;

}

void dfs(vector<int>& nums,int pos){

if(pos==nums.size()){

ret.push_back(path);

return;

}

path.push_back(numspos);

dfs(nums,pos+1);

path.pop_back();

dfs(nums,pos+1);

}

};

相关推荐
cpp_250122 分钟前
P1540 [NOIP 2010 提高组] 机器翻译
数据结构·c++·算法·队列·noip·洛谷题解
晚笙coding24 分钟前
LeetCode 98:验证二叉搜索树 —— 从局部判断到全局范围约束的递归思想
算法·leetcode·职场和发展
学计算机的计算基38 分钟前
回溯算法下篇:四道经典题讲透约束剪枝、原地标记、预计算与状态压缩
java·笔记·算法
霸道流氓气质1 小时前
SpringBoot中实现告警判定算法-位报警与模拟量阈值-技术详解
spring boot·算法·jquery
行者全栈架构师1 小时前
混元 Hy3 Agent 实战:季度报告 3 小时变 40 分钟
算法·架构·代码规范
兰令水1 小时前
hot100【acm版】【2026.7.21打卡-java版本】
java·开发语言·算法·leetcode·面试
好好沉淀2 小时前
主键选择(自增 vs UUID vs 雪花算法)
java·算法
退休倒计时3 小时前
【每日一题】LeetCode 131. 分割回文串 TypeScript
算法·leetcode·typescript
小白说大模型3 小时前
AI Agent 调试实战:链路追踪、Prompt 可视化与异常定位的系统方法
java·人工智能·python·算法·prompt
梅梅绵绵冰3 小时前
算法题-矩阵
数据结构·算法·矩阵