本题要求最左下叶子结点的值,采用层序遍历的方法记录每一层最左侧的结点则覆盖后最后一层的最左侧结点即为所求。
具体代码如下:
class Solution {
public:
int findBottomLeftValue(TreeNode* root) {
queue<TreeNode*>qu;
qu.push(root);
int result=0;
while(!qu.empty())
{
int size=qu.size();
for(int i=0;i<size;i++)
{
TreeNode*t=qu.front();
if(i==0)
{
result=qu.front()->val;
}
qu.pop();
if(t->left){qu.push(t->left);}
if(t->right){qu.push(t->right);}
}
}
return result;
}
};
本题利用回溯的方法遍历根结点到叶子结点的所有路径,每经过一个结点将目标值减去结点值,当到达叶子结点时若目标值减为零则求出目标路径。
具体代码如下:
class Solution {
public:
bool hasPathSum(TreeNode* root, int targetSum) {
if(root==NULL)
{
return false;
}
return traversal(root,targetSum-root->val);
}
bool traversal(TreeNode*root,int sum)
{
if(root->left==NULL&&root->right==NULL&&sum==0)
{
return true;
}
if(root->left==NULL&&root->right==NULL&&sum!=0)
{
return false;
}
if(root->left)
{
sum-=root->left->val;
if(traversal(root->left,sum)){return true;}
sum+=root->left->val;
}
if(root->right)
{
sum-=root->right->val;
if(traversal(root->right,sum)){return true;}
sum+=root->right->val;
}
return false;
}
};
本题要通过中序和后序序列构造二叉树,重点在于分割中序和后序数组进行递归调用,后序的最后一个数值为根结点,可将中序分为左中序和右中序,再根据左中序和右中序的长度将后序数组分为左后序和右后序。
具体代码如下:
class Solution {
private:
TreeNode*gettree(vector<int>& inorder, vector<int>& postorder)
{
if(postorder.size()==0)
{
return NULL;
}
int rootval=postorder[postorder.size()-1];
TreeNode*root=new TreeNode(rootval);
if(postorder.size()==1){return root;}
int inindex;
for(inindex=0;inindex<inorder.size();inindex++)
{
if(inorder[inindex]==rootval)
{
break;
}
}
vector<int>leftinorder(inorder.begin(),inorder.begin()+inindex);
vector<int>rightinorder(inorder.begin()+inindex+1,inorder.end());
postorder.resize(postorder.size()-1);
vector<int>leftpostorder(postorder.begin(),postorder.begin()+leftinorder.size());
vector<int>rightpostordr(postorder.begin()+leftinorder.size(),postorder.end());
root->left=gettree(leftinorder,leftpostorder);
root->right=gettree(rightinorder,rightpostordr);
return root;
}
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if(inorder.size()==0||postorder.size()==0)
{
return NULL;
}
return gettree(inorder,postorder);
}
};