首页 > 其他分享 >day33

day33

时间:2022-12-10 19:45:11浏览次数:43  
标签:right TreeNode day33 result NULL root left

【0257.二叉树的所有路径】

  • 我的迭代法 运行不成功
/**
 * 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> binaryTreePaths(TreeNode* root) {
        stack<TreeNode*> st1;
        vector<string> result;
        if (root != NULL)   st1.push(root);
        int i = 0;
        while (!st1.empty()) {
            TreeNode* node1 = st1.top();
            st1.pop();
            result[i].push_back(node1->val);
            result[i].push_back('->');
            if (node1->right) {
                st1.push(node1->right);
                result[i].push_back(node1->right->val);
                result[i].push_back('->');
            }
            if (node1->left) {
                st1.push(node1->left);
                result[i].push_back(node1->left->val);
                result[i].push_back('->');
            }
        }
        return result;
    }
};
  • 我的递归法 运行不成功
/**
 * 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> path(TreeNode* root) {
        vector<string> result;
        int i = 0;
        if (root->left == NULL && root->right == NULL) {
            result[i].push_back(root->val);
            i++;
        }            
        if (root->left != NULL) {
            result[i].push_back(root->left->val);
            result[i].push_back('->');
        }
        if (root->right != NULL) {
            result[i].push_back(root->right->val);
            result[i].push_back('->');
        }
    }
    vector<string> binaryTreePaths(TreeNode* root) { 
        vector<string> result;

        return result;
    }
};
  • 递归法 看了思路后

    • 三部曲之第一步 输入输出参数

      void traversal(TreeNode* cur, vector<int>& path, vector<string>& result)
      
      • 为什么这个亚子 好像懂了又好像没懂。。。
      • 别忘了& 否则就只是值传递
    • 三部曲之第二步 结束条件

      if (cur->left == NULL && cur->right == NULL) { //叶子节点
                  string sPath;
                  for (int i = 0; i < path.size()-1; i++) {
                      sPath += to_string(path[i]);
                      sPath += "->";
                  }
                  sPath += to_string(path[path.size()-1]);
                  result.push_back(sPath);
      } 
      
      • 语法逻辑需注意学习: 在执行此段代码之前 将多个节点值存在vector path中》》》》用string sPath把vector path中所有值记录成一个字符串 sPath +=to_string(path[i])》》》》》》》把string sPath赋值给vector result的一个元素 result.push_back(sPath)
    • 三部曲之第三步 子循环

      		if (cur->left != NULL) {
                  path.push_back(cur->left->val);
                  traversal(cur->left, path, result);
              }
              if (cur->right != NULL) {
                  path.push_back(cur->right->val);
                  traversal(cur->right, path, result);             
      }
      
      • 我写的一塌糊涂 看了代码提示后
      		path.push_back(cur->val)  
              if (cur->left != NULL) {
                  traversal(cur->left, path, result);
              }
              path.pop_back();
              if (cur->right != NULL) {
                  traversal(cur->right, path, result);           
              }
      
      • 上面代码还是错误地 卡哥说递归和回溯最遥远的距离是你在花括号里而我在花括号外 代码更改如下
      	    path.push_back(cur->val) //中,中为什么写在这里,因为最后一个节点也要加入到path中 
              if (cur->left != NULL) { //左
                  traversal(cur->left, path, result);
                  path.pop_back();
              }
              if (cur->right != NULL) { //右
                  traversal(cur->right, path, result);           
                  path.pop_back();
              }
      
      • 注意注意 对中的处理 不代表就是放在if(cur->left != NULL)的上一行 注意位置 虽然没太懂。。。。
    • 主函数 一塌糊涂,too

       vector<string> binaryTreePaths(TreeNode* root) { 
              vector<string> result;
              vector<int> path;
              if (root == NULL) return NULL;
              traversal(root, path, result);
              return result;
          }
      
    • 更改如下

       vector<string> binaryTreePaths(TreeNode* root) { 
              vector<string> result;
              vector<int> path;
              if (root == NULL) return result;
              traversal(root, path, result);
              return result;
          }
      
      • 注意注意 当结点为空时返回值 不是NULL 而是result 为什们 这取决于主函数的返回值是什么类型 -----是vector类型而不是指针类型 就算没给result赋值 也可返回result 原因涉及语法解释 默认初值
  • 递归法 简化版本 很有必要再看看练练

  • 迭代法-----过过过 下次看

【0404.左叶子之和】

  • 还以为自己能一遍ac 不曾想

    /**
     * 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 sumOfLeftLeaves(TreeNode* root) {
            queue<TreeNode*> que1;
            int result = 0;
            if (root != NULL)   que1.push(root);
            while(!que1.empty()) {
                int size = que1.size();
                for (int i = 0; i < size; i++) {
                    TreeNode* node = que1.front();
                    que1.pop();
                    if (i == 0 && node->left == NULL && node->right == NULL)    result += node->val;
                    if (node->left)     que1.push(node->left);
                    if (node->right)    que1.push(node->right);
                }
            } 
            return result;  
        }
    };
    
  • 看了思路提示 问题在于 如何判断该节点是否为左节点 也就是说 上面的代码部分for循环里的第一个if判断的语句逻辑是错误的 更改正确版本见下

    class Solution {
    public:
        int sumOfLeftLeaves(TreeNode* root) {
            queue<TreeNode*> que1;
            int result = 0;
            if (root != NULL)   que1.push(root);
            if (root->left == NULL && root->right == NULL)  return result;
            while(!que1.empty()) {
                int size = que1.size();
                for (int i = 0; i < size; i++) {
                    TreeNode* node = que1.front();
                    que1.pop();
                    if (node->left != NULL && node->left->left == NULL && node->left->right == NULL)    result += node->left->val;
                    if (node->left)     que1.push(node->left);
                    if (node->right)    que1.push(node->right);
                }
            } 
            return result;  
        }
    };
    
  • 以上是我的答案 层次遍历迭代法 最后一段代码是可以ac的

  • 以下是卡哥提供的方案 包括 三种深度遍历迭代法 深度遍历递归法 我先自己写写代码

  • 深度遍历迭代法

    class Solution {
    public:
        int sumOfLeftLeaves(TreeNode* root) {
            stack<TreeNode*> st1;
            int result = 0;
            if (root != NULL)   st1.push(root);
            if (root->left == NULL && root->right == NULL)  return result;
            while(!st1.empty()) {
                TreeNode* node = st1.top();
                st1.pop();
                if (node->left != NULL && node->left->left == NULL && node->left->right == NULL)    result += node->left->val;
                if (node->right)    st1.push(node->right);
                if (node->left)     st1.push(node->left);     
            } 
            return result;  
        }
    };
    
    • 一遍ac 其实就是相比于层次遍历 除了把queue换成stack外 改了几行代码而已
    • 另外注意 每次遍历都不提前考虑用前中后哪种遍历方式更好---默认都写成了前序遍历 虽然很多题三种遍历方式均可 但还是要自己提前清楚是用的哪种方式 这个习惯要养成 为了防止个别题目对某种遍历方式不友好
  • 深度遍历递归法

    • 前序(先根) 其余方式省略
    class Solution {
    public:
        void sumLeftNode(TreeNode* cur, int result) {
            if (cur->left != NULL && cur->left->left == NULL && cur->left->right == NULL)   
                result += cur->left->val;
            if (cur->left)  sumLeftNode(cur->left, result);
            if (cur->right) sumLeftNode(cur->right, result);
        }
        int sumOfLeftLeaves(TreeNode* root) {
            int result = 0;
            if (root == NULL || (root->left == NULL && root->right == NULL))    
                return result;
            sumLeftNode(root, result); 
            return result;  
        }
    };
    
    • 其实 我不太明白的 就是递归三部曲中第一步 什么时候需要返回值 什么时候可以把返回值放在输入参数里面一起带走 下面是我 调整返回值后的代码 Ac!!!
    class Solution {
    public:
        int sumLeftNode(TreeNode* cur) {
            int result = 0;        
            if (cur->left != NULL && cur->left->left == NULL && cur->left->right == NULL){
                result += cur->left->val; 
            } 
            
            if (cur->left)  result += sumLeftNode(cur->left);
            if (cur->right) result += sumLeftNode(cur->right);
            return result;
        }
        int sumOfLeftLeaves(TreeNode* root) {
            int result = 0;
            if (root == NULL || (root->left == NULL && root->right == NULL))    
                return result;
            result = sumLeftNode(root); 
            return result;  
        }
    };
    
    • 因为 我还是对上面提到的问题 ----- 什么时候写返回值什么时候不写而是放输入参数里 我觉得放在输入参数里的--也就是上面这段代码貌似逻辑比上上面--用返回值 逻辑更清晰? 、
    • 需要注意的是 result+= 每次都是这样 而不应该出现result= 这样会影响递归的值累计传递的

标签:right,TreeNode,day33,result,NULL,root,left
From: https://www.cnblogs.com/deservee/p/16972168.html

相关文章

  • Day33:String类及其常用方法详解
    String类1.1String类概述Java中字符串属于对象,String类用于创建和操作字符串。最简单的字符串创建:直接通过String创建Stringstr="工地佬";利用String构造器创建字......
  • day33-JSON&Ajax01
    JSON&Ajax01JSON在线文档AJAX在线文档1.JSON介绍JSON指的是JavaScript对象表示法(JavaScriptObjectNotation),JSON的本质仍然是JavaScript对象JSON是轻量......
  • 代码随想录Day33
    LeetCode530.二叉搜索树的最小绝对差给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。示例:提示:树中至少有2个节点。思路:由于是......
  • day33- js基础语法
    字符串正常字符串使用单双引号包裹转义字符\'\n\t\u4e2d(\u####)unicode字符Ascll字符多行字符串``tab键上面的``包含多行字符模板字符串需要使......
  • 进入python的世界_day33_网络编程—— 黏包现象、UDP协议、并发编程理论
    一、黏包现象1.何为黏包​ 流逝协议:所有的数据类似于水流连接在一起的​ 数据量很小并且时间间隔很多那么就会自动组织到一起recv​ 我们不知道即将要接收的......
  • day33 过滤器filter & 监听器listener & 利用反射创建BaseServlet实现调用自定义业务
    Filter过滤器Fileter可以实现:1)客户端的请求访问servlet之前拦截这些请求,对用户请求进行预处理2)对HttpServletResponse进行后处理;注意多个Filter的执行顺序在web.xml配......
  • day33
    html样式1.样式分为内联样式和外联样式: 内联样式:样式代码直接写在当前html页面中 外联样式:样式写在XXX.css文件中,并且在需要的页面中,使用Link标签引入2.样式:样......
  • day33
    流流根据方向的不同,可以分为输入和输出流(I/O流)输入流:用来读取数据的输出流:用来写出数据的流又可以分为低级流(字节流)和高级流(处理流或者过滤流)注意:高级流是......
  • Day33内部类
    内部类内部类就是在一个类的内部再定义一个类,比如,A类中定义一个B类,那么B类相对于A类来说就成为内部类,而A类相对于B类来说就是外部类了。1.成员内部类2.静态内部类3.局......
  • 2022-08-23 day33 第一小组 王鸣赫
    目录CSS三大特性1、层叠性2、继承性3、优先级常用单位字体背景列表属性盒子模型display的inline、block、inline-block的区别文档流定位定位的left和top、right和bottom和m......