513.找树左下角的值
题目链接
题目描述
给定一个二叉树的 根节点 root
,请找出该二叉树的 最底层 最左边 节点的值。
假设二叉树中至少有一个节点。
代码思路
这道题还是不太会,脑子糊糊的,还是感觉递归和回溯没有掌握好,不知道怎么确定递归的参数和返回值,不知道怎么在最深的情况下找最左的,所以后来看了标准答案。
/**
* 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 maxLen;
int result;
void travelsal(TreeNode* root,int len){
if(root->left==NULL&&root->right==NULL){
if(len>maxLen){
result=root->val;
maxLen=len;
}
return;
}
if(root->left){
len++;
travelsal(root->left,len);
len--;
}
if(root->right){
len++;
travelsal(root->right,len);
len--;
}
}
int findBottomLeftValue(TreeNode* root) {
travelsal(root,1);
return result;
}
};
如何确定最深的同时是最左的,就在于先左后右进行递归,并且回溯(回溯在这里是必须的,要不然就不能去一一往右走看得到更深的节点),只有当深度更大时变换最终值,这样能够得到最左最深的值。
112.路径总和
题目链接
题目描述
给你二叉树的根节点 root
和一个表示目标和的整数 targetSum
。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum
。如果存在,返回 true
;否则,返回 false
。
叶子节点 是指没有子节点的节点。
代码思路
这道题和上道题513思路还是有相似之处的,明确递归的参数,确定回溯的地方,就可以了。
/**
* 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 sum=0;
bool has=false;
void path(TreeNode* root,int targetSum){
if(root==NULL) return;
sum+=root->val;
if(root->left==NULL&&root->right==NULL){
if(sum==targetSum){
has=true;
}
return;
}
if(root->left){
path(root->left,targetSum);
sum-=root->left->val;
}
if(root->right){
path(root->right,targetSum);
sum-=root->right->val;
}
return;
}
bool hasPathSum(TreeNode* root, int targetSum) {
path(root,targetSum);
return has;
}
};
106.从中序与后序遍历序列构造二叉树
题目链接
106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)
题目描述
代码思路
从中序和后序的序列中找逻辑,其实就是后序末尾就是root节点,并用此对中序节点进行划分。
问题是,逻辑是懂得,但是在后面的迭代不明白,看完答案说是通过改变区间来进行迭代,而在区间的划分上也出现了问题,不知道如何划分,begin()后面加多少?
/**
* 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:
TreeNode* travelsal(vector<int>& inorder, vector<int>& postorder){
if(postorder.size()==0) return NULL;
TreeNode* root=new TreeNode(postorder[postorder.size()-1]);
if(postorder.size()==1) return root;
int midroot;
for(int i=0;i<postorder.size();i++){
if(inorder[i]==root->val){
midroot=i;
break;
}
}
vector<int> leftinoder(inorder.begin(),inorder.begin()+midroot);
vector<int> rightinoder(inorder.begin()+midroot+1,inorder.end());
postorder.resize(postorder.size()-1);
vector<int> leftpostorder(postorder.begin(),postorder.begin()+midroot);
vector<int> rightpostorder(postorder.begin()+midroot,postorder.end());
root->left=travelsal(leftinoder,leftpostorder);
root->right=travelsal(rightinoder,rightpostorder);
return root;
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
TreeNode* root=travelsal(inorder,postorder);
return root;
}
};
主要在leftinorder()和rightinorder()中间写错了,去查后发现end()是指向向量最后一个元素的下一个位置,故而,如果我想要到midroot前一个元素,我应该到midroot元素开头。