算法专题[递归-搜索-回溯-2-DFS]
- 一.计算布尔二叉树的值:
- 1.思路一:
- 2.GIF题目解析
- 二.求根节点到叶子节点的数字之和
- 1.思路一:
- 2.GIF题目解析
- 三.二叉树剪枝
- 1.思路一:
- 2.GIF题目解析
- 四.验证二叉搜索树
- 1.思路一:
- 2.GIF题目解析
- 五.二叉搜索树中第k小的元素
- 1.思路一:
- 2.GIF题目解析
- 六.二叉树的所有路径
- 1.思路一:
- 2.GIF题目解析
一.计算布尔二叉树的值:
计算布尔二叉树的值
1.思路一:
class Solution {
public:
bool evaluateTree(TreeNode* root) {
if(root->left==nullptr && root->right==nullptr)
return (root->val==1? true:false);
bool left = evaluateTree(root->left);
bool right = evaluateTree(root->right);
return root->val = (root->val==2? (left||right):(left&&right));
}
};
2.GIF题目解析
二.求根节点到叶子节点的数字之和
求根节点到叶子节点的数字之和
1.思路一:
class Solution {
public:
int dfs(TreeNode* root , int sum)
{
if(root==nullptr)
return 0;
sum = (sum*10)+(root->val);
if(root->left==nullptr && root->right==nullptr)
{
return sum;
}
int ret = 0 ;
if(root->left != nullptr) ret += dfs(root->left , sum );
if(root->right != nullptr) ret += dfs(root->right , sum );
return ret;
}
int sumNumbers(TreeNode* root) {
return dfs(root , 0);;
}
};
2.GIF题目解析
三.二叉树剪枝
二叉树剪枝
1.思路一:
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;
}
};
2.GIF题目解析
四.验证二叉搜索树
验证二叉搜索树
1.思路一:
class Solution {
public:
bool isValidBST(TreeNode* root) {
if(root==nullptr)
return true;
bool left = isValidBST(root->left);
if(root->val > prev)
prev = root->val;
else
return false;
bool right = isValidBST(root->right);
return left&&right;
}
long prev = LONG_MIN;
};
class Solution {
public:
bool isValidBST(TreeNode* root) {
if(root==nullptr)
return true;
bool left = isValidBST(root->left);
if(left && root->val > prev)
prev = root->val;
else
return false;
bool right = isValidBST(root->right);
return left&&right;
}
long prev = LONG_MIN;
};
2.GIF题目解析
五.二叉搜索树中第k小的元素
二叉搜索树中第k小的元素
1.思路一:
class Solution {
public:
void dfs_1(vector<int>& dfs1 , TreeNode* root)
{
if(root==nullptr)
return;
int n = root->val;
dfs1.push_back(n);
dfs_1(dfs1 , root->left);
dfs_1(dfs1 , root->right);
}
int kthSmallest(TreeNode* root, int k) {
//1.遍历:
vector<int> dfs;
dfs_1(dfs ,root);
//2.排序:
sort(dfs.begin(),dfs.end());
return dfs[k-1];
}
};
2.GIF题目解析
六.二叉树的所有路径
二叉搜索树的所有路径
1.思路一:
1.模拟路径去走判断到叶子节点然后给一个参数去push_back()
2.思路的函数参数是比较好的通过这样的参数可以解决很多问题。
3.特殊情况判断:只有一个节点的判断!
class Solution {
public:
void dfs(TreeNode* root , string s , vector<string>& ret)
{
if(root == nullptr)
return;
int n = root->val;
s += "->";
s += to_string(n);
//表示当前是叶子节点
if(root->left == nullptr && root->right==nullptr)
{
ret.push_back(s);
return;
}
dfs(root->left , s , ret);
dfs(root->right , s , ret);
}
vector<string> binaryTreePaths(TreeNode* root) {
string s = to_string(root->val);
vector<string> ret;
if(root->left == nullptr && root->right==nullptr)
{
ret.push_back(s);
}
else
{
dfs(root->left , s , ret);
dfs(root->right , s , ret);
}
return ret;
}
};