代码随想录算法训练营第十八天 | 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()); } };