当前位置:   article > 正文

DFS:二叉树的深搜与回溯

DFS:二叉树的深搜与回溯

   一、计算布尔二叉树的值

. - 力扣(LeetCode)

  1. class Solution {
  2. public:
  3. bool evaluateTree(TreeNode* root)
  4. {
  5. if(root->left==nullptr) return root->val==0?false:true;
  6. bool left= evaluateTree(root->left);
  7. bool right=evaluateTree(root->right);
  8. return root->val==2?left||right:left&&right;
  9. //直接return root->val==2?evaluateTree(root->left)||evaluateTree(root->right):evaluateTree(root->left)&&evaluateTree(root->right) 会导致递归的时间变长,因为我们没有去记住返回值,所以一旦需要就得重新递归回去计算
  10. }
  11. };

二、求根节点到叶节点的数字之和

. - 力扣(LeetCode)

  1. class Solution {
  2. public:
  3. int dfs(TreeNode* root,int presum)//presum也是为了回溯
  4. {
  5. if(root==nullptr) return 0;
  6. presum=10*presum+root->val;//因为不管怎么样都得加
  7. if(root->left==nullptr&&root->right==nullptr) return presum;
  8. //此时如果左右不为空,加上这个结果
  9. return dfs(root->left,presum)+dfs(root->right,presum);
  10. }
  11. int sumNumbers(TreeNode* root)
  12. {
  13. return dfs(root,0);
  14. }
  15. };

三、二叉树剪枝

. - 力扣(LeetCode)

  1. class Solution {
  2. public:
  3. TreeNode* pruneTree(TreeNode* root)
  4. {
  5. if(root==nullptr) return nullptr;
  6. root->left=pruneTree(root->left);
  7. root->right=pruneTree(root->right);
  8. if(root->left==nullptr&&root->right==nullptr&&root->val==0) delete root;
  9. return root;
  10. }
  11. };

四、 验证二叉搜索树

 . - 力扣(LeetCode)

  1. class Solution {
  2. public:
  3. long prev=LONG_MIN;//比负无穷还小
  4. bool isValidBST(TreeNode* root)
  5. {
  6. if(root==nullptr) return true;//为空的话是符合条件的
  7. //进行中序遍历
  8. bool l=isValidBST(root->left);//先找左子树
  9. if(l==false) return false;//减枝(大多数的减枝就只是一个条件判断)
  10. bool temp=(prev<root->val);//判断当前是否大于前驱
  11. if(temp==false) return false;//减枝
  12. prev=root->val;//更新前驱
  13. bool r=isValidBST(root->right);//再找右子树
  14. return r;
  15. }
  16. };

五、二叉搜索树中第k小的节点

. - 力扣(LeetCode)

  1. class Solution {
  2. public:
  3. int count=0;
  4. int ret=0;
  5. int kthSmallest(TreeNode* root, int k)
  6. {
  7. count=k;
  8. dfs(root);
  9. return ret;
  10. }
  11. void dfs(TreeNode* root)
  12. {
  13. if(root==nullptr) return;
  14. dfs(root->left);
  15. //中序遍历
  16. if(--count==0) {ret=root->val; return;}//if判断也是剪枝
  17. dfs(root->right);
  18. }
  19. };

 六、二叉树的所有路径

  1. class Solution {
  2. public:
  3. vector<string> ret;//利用全局变量来存储我们返回的结果
  4. void dfs(TreeNode* root,string path)
  5. {
  6. if(root==nullptr) return;//为空 啥也不干
  7. path+=to_string(root->val);//不为空的话,把自己给加上
  8. if(root->left==nullptr&&root->right==nullptr)
  9. ret.push_back(path); //如果是叶子节点,返回最终结果
  10. else //不是叶子节点的话,继续往后找
  11. {
  12. path+="->";
  13. //继续去左右子树去找
  14. dfs(root->left,path);
  15. dfs(root->right,path);
  16. }
  17. }
  18. vector<string> binaryTreePaths(TreeNode* root)
  19. {
  20. dfs(root,"");
  21. return ret;
  22. }
  23. };

 七、路径总和2

. - 力扣(LeetCode)

思路1:全局path+回溯 

  1. class Solution {
  2. public:
  3. vector<vector<int>> ret;
  4. vector<int> path;
  5. vector<vector<int>> pathSum(TreeNode* root, int targetSum)
  6. {
  7. dfs(root,targetSum);
  8. return ret;
  9. }
  10. void dfs(TreeNode* root,int targetSum)
  11. {
  12. if(root==nullptr) return;
  13. //if(targetSum<0) return;有负数,所以不能剪枝
  14. targetSum-=root->val;
  15. path.push_back(root->val);
  16. if(root->left==nullptr&&root->right==nullptr&&targetSum==0) {ret.push_back(path);return;}
  17. dfs(root->left,targetSum);
  18. if(root->left) path.pop_back();
  19. dfs(root->right,targetSum);
  20. if(root->right) path.pop_back();
  21. }
  22. };

思路2:形参path记录路径结果

  1. class Solution {
  2. public:
  3. vector<vector<int>> ret;
  4. vector<vector<int>> pathSum(TreeNode* root, int targetSum)
  5. {
  6. dfs(root,targetSum,{});
  7. return ret;
  8. }
  9. void dfs(TreeNode* root,int targetSum,vector<int> path)
  10. {
  11. if(root==nullptr) return;
  12. targetSum-=root->val;
  13. path.push_back(root->val);
  14. if(root->left==nullptr&&root->right==nullptr&&targetSum==0) ret.push_back(path);
  15. dfs(root->left,targetSum,path);
  16. dfs(root->right,targetSum,path);
  17. }
  18. };

八、从叶节点开始的最小字符串 

. - 力扣(LeetCode)

思路1:全局path+回溯

  1. class Solution {
  2. public:
  3. string minpath;
  4. string path;
  5. string smallestFromLeaf(TreeNode* root)
  6. {
  7. dfs(root);
  8. return minpath;
  9. }
  10. void dfs(TreeNode* root)
  11. {
  12. if(root==nullptr) return;
  13. //先加上对应的节点
  14. path=char(root->val+'a')+path;
  15. //如果是叶子节点,那么就和minpath进行比较,小的话更新
  16. if(root->left==nullptr&&root->right==nullptr)//是叶子,就要进行比较
  17. if(minpath.empty()||minpath>path) //为空的时候,也要更新
  18. minpath=path;//更新
  19. //没找到,就去左右子树找
  20. dfs(root->left);
  21. if(root->left) path.erase(path.begin());
  22. dfs(root->right);
  23. if(root->right) path.erase(path.begin());
  24. }
  25. };

思路2:参数path记录路径结果 

  1. class Solution {
  2. public:
  3. string minpath;
  4. string smallestFromLeaf(TreeNode* root)
  5. {
  6. dfs(root,"");
  7. return minpath;
  8. }
  9. void dfs(TreeNode* root,string path)
  10. {
  11. if(root==nullptr) return;
  12. //先加上对应的节点
  13. path=char(root->val+'a')+path;
  14. //如果是叶子节点,那么就和minpath进行比较,小的话更新
  15. if(root->left==nullptr&&root->right==nullptr)//是叶子,就要进行比较
  16. if(minpath.empty()||minpath>path) //为空的时候,也要更新
  17. minpath=path;//更新
  18. //没找到,就去左右子树找
  19. dfs(root->left,path);
  20. dfs(root->right,path);
  21. }
  22. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/393533
推荐阅读
相关标签
  

闽ICP备14008679号