文章目录
- 前言
- 计算布尔二叉树的值
- 求根节点到叶节点数字之和
- 解析
- 代码
- 二叉树剪枝
- 解析
- 代码
- 验证二叉搜索树
- 解析
- 代码
- 二叉搜索树中第K小的元素
- 代码
- 二叉树的所有路径
- 解析
- 代码
前言
大家好我是jiantaoyab,在这里分享给大家二叉树深搜相关题目的练习和解析,通过做题发现这树中的递归是非常好找的一般就是前序,中序,后序,为什么叫深搜呢?大家可以看看我第一篇
计算布尔二叉树的值
https://leetcode.cn/problems/evaluate-boolean-binary-tree/
class Solution {
public:bool evaluateTree(TreeNode* root) {//根节点返回valif(root->left == nullptr && root->right == nullptr) return root->val == 0 ? false : true;bool l = evaluateTree(root->left);bool r = evaluateTree(root->right);//知道 l 和 r 的值,返回 | / & 的结果return root->val == 2 ? l | r : l & r ;}
};
求根节点到叶节点数字之和
https://leetcode.cn/problems/3Etpl5/
解析
在 9 的这个位置下,只要算出它的左子树 和 右子树 的和就能够返回给上一层
递归的终止条件是到了叶子节点,此时返回presum就可以
代码
class Solution {
public:int PreOrder(TreeNode* root, int pre_sum){//当前节点的上一个总和pre_sum = pre_sum * 10 + root->val;//到了叶子返回if(root->left == nullptr && root->right == nullptr) return pre_sum;int ret = 0; //记录结果if(root->left)ret += PreOrder(root->left, pre_sum);if(root->right)ret += PreOrder(root->right, pre_sum);return ret;}int sumNumbers(TreeNode* root) {return PreOrder(root, 0);}
};
二叉树剪枝
https://leetcode.cn/problems/pOCWxh/
解析
分析这个例题,剪节点要通过后序遍历去操作
那什么时候执行剪呢?
当节点是根节点的且值是0的时候,返回nullptr
代码
class Solution {
public:TreeNode* pruneTree(TreeNode* root) {if(root == nullptr) return nullptr;if(root->left) root->left = pruneTree( root->left);if(root->right) root->right = pruneTree( root->right);if(root->val == 0 && root->left == nullptr && root->right == nullptr){ root = nullptr;}return root;}
};
验证二叉搜索树
https://leetcode.cn/problems/validate-binary-search-tree/
解析
我们知道二叉树的中序遍历会把树排成有序的,但是开销的空间太大了,所以不用这种方法,
代码
class Solution {
public:long prev_root = 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_root)cur = true; //剪枝if(cur == false) return false; prev_root = root->val;bool right = isValidBST(root->right);return left && right && cur;}
};
二叉搜索树中第K小的元素
https://leetcode.cn/problems/kth-smallest-element-in-a-bst/
我们的中序遍历的结果就是升序的,所以题目问第k小的元素,只要用一个计数器等于k,计数器的结果等于0的时候就是第k小的元素
代码
class Solution {int count;int ret;
public:void LDR(TreeNode* root){if(root == nullptr || count == 0) return;LDR(root->left);count--;if(count == 0) ret = root->val;LDR(root->right);}int kthSmallest(TreeNode* root, int k) {count = k;LDR(root);return ret;}
};
二叉树的所有路径
https://leetcode.cn/problems/binary-tree-paths/
解析
代码
class Solution {vector<string> ret;
public:void dfs(TreeNode* root, string tmp){//不管是不是叶子先放进去tmp += to_string(root->val);//是叶子了,放入retif(root->left == nullptr && root->right == nullptr){ret.push_back(tmp);return;}tmp += "->";//这里2个if包含了剪枝//就是如果左边或者右边没有的话,就不进去了if(root->left) dfs(root->left, tmp);if(root->right) dfs(root->right, tmp); }vector<string> binaryTreePaths(TreeNode* root) {if(root == nullptr) return ret;string tmp;dfs(root, tmp);return ret;}
};
right, tmp);
}
vector binaryTreePaths(TreeNode* root) {
if(root == nullptr) return ret;
string tmp;
dfs(root, tmp);
return ret;
}
};