513.找树左下角的值:代码随想录
这道题目的意思就是让你找最后一层的最左端结点的值,我采用的是层序遍历的方法,找到最后一层的第一个节点就可以了,来看具体代码的实现
int findBottomLeftValue(TreeNode* root) {
if(root==NULL) return 0;
int dp=depth(root);
queue<TreeNode*>q;
q.push(root);int x=0;
while(q.empty()==false){
x++;
int size=q.size();
while(size--){
if(x==dp){
return q.front()->val;
}
TreeNode* node=q.front();
q.pop();
if(node->left!=NULL) q.push(node->left);
if(node->right!=NULL) q.push(node->right);
}
}
return 0;
}
int depth(TreeNode* root){
if(root==NULL) return 0;
int leftdepth=depth(root->left);
int rightdepth=depth(root->right);
return max(leftdepth,rightdepth)+1;
}
这里首先定义了一个求深度的函数,当到达这个深度的时候再返回第一个元素就可以了
112. 路径总和 113.路径总和ii:
代码随想录
这两道题都是差不多的意思,就是让你求路径,同样是用递归加回溯的方法,在满足条件时返回,或者将答案加入到结果集中,接着递归左右子树,递归出来记得回溯就可以了
106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树:
代码随想录
这两道题主要是要知道他的一个思路,还有就是如何分割他们的区间,来看具体代码,这里只拿一个举例
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.size()==0) return NULL;
int val=preorder[0];
TreeNode* root= new TreeNode(val);
int index=0;
for(index;index<inorder.size();index++){
if(inorder[index]==val){
break;
}
}
vector<int> leftin;vector<int> leftpre;
for(int i=0;i<index;i++){
leftin.push_back(inorder[i]);
}
for(int i=1;i<index+1;i++){
leftpre.push_back(preorder[i]);
}
vector<int> rightin;vector<int> rightpre;
for(int i=index+1;i<inorder.size();i++){
rightin.push_back(inorder[i]);
}
for(int i=index+1;i<preorder.size();i++){
rightpre.push_back(preorder[i]);
}
root->left=buildTree(leftpre,leftin);
root->right=buildTree(rightpre,rightin);
return root;
}
这里首先也是用递归来做,在中序遍历序列中找到根节点时,就根据他的下标来划分他的leftin和leftpre,这里只要考虑好边界就可以了