代码随想录算法训练营第十八天 | 513. 找树左下角的值、112. 路径总和、106. 从中序与后序遍历序列构造二叉树

96 阅读1分钟

代码随想录算法训练营第十八天 | 513. 找树左下角的值、112. 路径总和、106. 从中序与后序遍历序列构造二叉树

513. 找树左下角的值

题目链接:513. 找树左下角的值

  • 迭代法
  • 和递归法,递归到的最大深度的第一个数就是需要找的数。

112. 路径总和

题目链接:112. 路径总和

  • 分解的做法和遍历的做法

  • 一个traverse的函数

    •  int target;
           bool found = false;
           int curSum = 0;
           void traverse(TreeNode* root) {
               if(root == nullptr) return;
               curSum += root->val;
       ​
               if (root->left == nullptr && root->right == nullptr) {
                   if(curSum == target) {
                       found = true;
                       curSum -= root->val;
                       return;
                   }
               }
               // cout << root->val << ' ' << "curSum " << curSum << endl; 
               traverse(root->left);
               traverse(root->right);
               curSum -= root->val;
           }
      

106. 从中序与后序遍历序列构造二叉树

题目链接:106. 从中序与后序遍历序列构造二叉树

  • 利用map来便捷地在中序数组中找到下标, 然后计算左边元素的个数就可以了

     class Solution {
     ​
     map<int, int> umap;
     private:
         TreeNode* traversal (vector<int>& inorder, int inStart, int inEnd, vector<int>& postorder, int postStart, int postEnd) {
             if(inStart >= inEnd || postEnd <= postStart) {return nullptr;}
             int rootVal = postorder[postEnd - 1];
             int inRootIndex = umap[rootVal];
             int leftSize = inRootIndex - inStart;
             int rightSize = inEnd - inRootIndex;
             TreeNode* left = traversal(inorder, inStart, inRootIndex, postorder, postStart, postStart + leftSize);
             TreeNode* right = traversal(inorder, inRootIndex + 1, inEnd, postorder, postStart + leftSize, postEnd - 1);
     ​
             TreeNode *root = new TreeNode(rootVal);
             root->left = left;
             root->right = right;
     ​
             return root;
         }
     public:
         TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
             if (inorder.size() == 0 || postorder.size() == 0) return NULL;
             for(int i = 0; i < inorder.size(); i++) {
                 umap[inorder[i]] = i;
             }
             return traversal(inorder, 0, inorder.size(), postorder, 0, inorder.size());
         }
     };