1、513找树左下角的值
给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。假设二叉树中至少有一个节点。

我的思路:这道题for循环
的层序遍历最好做。如果递归,就是要找到最大深度的第一个节点。
代码随想录:一样。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| class Solution { public: int findBottomLeftValue(TreeNode* root) { if(root==nullptr)return 0; queue<TreeNode*> pq; pq.push(root);
TreeNode* target = nullptr;
while(!pq.empty()){ int sz = pq.size(); for(int i = 0;i<sz;i++){ auto node = pq.front(); if(i == 0){ target = node; } pq.pop(); if(node->left != nullptr){ pq.push(node->left); } if(node->right != nullptr){ pq.push(node->right); } } } return target->val; } };
class Solution { public: void traverse(TreeNode* root, int &maxDep,int &val, int curDep){ if(root->left == nullptr && root->right == nullptr){ if(curDep>maxDep){ maxDep = curDep; val = root->val; } return; } if(root->left != nullptr){ traverse(root->left,maxDep,val,curDep+1); } if(root->right != nullptr){ traverse(root->right,maxDep,val,curDep+1); } } int findBottomLeftValue(TreeNode* root) { int maxDep = -1, val = 0; traverse(root,maxDep,val,0); return val; } };
|
2、112路径总和
给你二叉树的根节点 root
和一个表示目标和的整数 targetSum
。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum
。如果存在,返回 true ;否则,返回 false 。
我的思路:递归解法。
代码随想录:看了代码随想录后发现可以再继续优化,每次求累加实际上重复了,我们维护一个求和就可以。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| class Solution { public: bool traverse(TreeNode* root, vector<TreeNode*> &path,int targetSum){ path.emplace_back(root); if(root->left == nullptr && root->right == nullptr){ int sum = 0; for(auto &node:path){ sum+=node->val; } path.pop_back(); return sum == targetSum?true:false; }
bool le = false, ri = false; if(root->left!=nullptr){ le = traverse(root->left,path,targetSum); if(le == true)return true; } if(root->right!=nullptr){ ri = traverse(root->right,path,targetSum); if(ri == true)return true; } path.pop_back(); return false; } bool hasPathSum(TreeNode* root, int targetSum) { if(root == nullptr)return false; vector<TreeNode*> path; return traverse(root,path,targetSum); } };
class Solution { public: bool traverse(TreeNode* root, int sum,int targetSum){ if(root->left == nullptr && root->right == nullptr){ return sum == targetSum?true:false; }
bool le = false, ri = false; if(root->left!=nullptr){ le = traverse(root->left,sum+root->left->val,targetSum); if(le == true)return true; } if(root->right!=nullptr){ ri = traverse(root->right,sum+root->right->val,targetSum); if(ri == true)return true; } return false; } bool hasPathSum(TreeNode* root, int targetSum) { if(root == nullptr)return false; return traverse(root,root->val,targetSum); } };
|
3、113路径综合II
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。
我的思路: 关键在于求路径那就需要记录路径,顺序路径意味着前序遍历。
代码随想录: 一样。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| class Solution { public: void traverse(TreeNode* root,vector<vector<int>> &paths, vector<int> &path, int sum,int targetSum){ path.emplace_back(root->val); if(root->left == nullptr && root->right == nullptr){ if(sum == targetSum){ paths.emplace_back(path); } path.pop_back(); return; }
if(root->left!=nullptr){ traverse(root->left,paths,path,sum+root->left->val,targetSum); } if(root->right!=nullptr){ traverse(root->right,paths,path,sum+root->right->val,targetSum); } path.pop_back(); return; } vector<vector<int>> pathSum(TreeNode* root, int targetSum) { if(root == nullptr)return vector<vector<int>>(); vector<vector<int>> paths; vector<int> path; traverse(root,paths,path,root->val,targetSum); return paths; } };
|
4、106从中序与后序遍历序列构造二叉树
给定两个整数数组 inorder
和 postorder
,其中 inorder
是二叉树的中序遍历, postorder
是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

我的思路: 没做出来。核心还是要熟二叉树的前中后遍历结果。
labuladong
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Solution { public: TreeNode* traverse(vector<int>& inorder, vector<int>& postorder, int instart, int inend, int poststart, int postend){ if(instart > inend){ return nullptr; }
auto root = new TreeNode(postorder[postend]); int rootidx = 0; for(rootidx = instart; rootidx<= inend; rootidx++){ if(inorder[rootidx] == root->val){ break; } } int lftsize = rootidx - instart; int rgtsize = inend - rootidx;
root->left = traverse(inorder,postorder,instart,rootidx-1,poststart,poststart+lftsize-1); root->right = traverse(inorder,postorder,rootidx+1,inend,poststart+lftsize,postend-1); return root; } TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) { return traverse(inorder,postorder,0,inorder.size()-1,0,postorder.size()-1); } };
|
5、105从前序与中序遍历序列构造二叉树

我的思路: 和106一样。核心还是要熟二叉树的前中后遍历结果。
labuladong
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| class Solution { public: TreeNode* traverse(vector<int>& inorder, vector<int>& preorder, int instart, int inend, int prestart, int preend){ if(instart > inend){ return nullptr; }
auto root = new TreeNode(preorder[prestart]); int rootidx = 0; for(rootidx = instart; rootidx<= inend; rootidx++){ if(inorder[rootidx] == root->val){ break; } } int lftsize = rootidx - instart;
root->left = traverse(inorder,preorder,instart,rootidx-1,prestart+1,prestart+lftsize); root->right = traverse(inorder,preorder,rootidx+1,inend,prestart+lftsize+1,preend); return root; } TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { return traverse(inorder,preorder,0,inorder.size()-1,0,preorder.size()-1); } };
|
代码随想录算法训练第十六天|513找树左下角的值|112路径总和|113路径综合II|106从中序与后序遍历序列构造二叉树|105从前序与中序遍历序列构造二叉树