求二叉树深度
class Solution {
public:
int maxDepth = INT_MIN;
int result;
void dfs(TreeNode* cur, int depth)
{
if (cur->left==nullptr && cur->right==nullptr)
{
if (depth>maxDepth)
{
maxDepth = depth;
result = cur->val;
}
return;
}
if (cur->left!=nullptr)
{
dfs(cur->left, depth+1);
}
if (cur->right!=nullptr)
{
dfs(cur->right, depth+1);
}
}
int findBottomLeftValue(TreeNode* root)
{
int depth = 1;
dfs(root, depth);
return result;
}
};
class Solution {
public:
bool ans;
void dfs(TreeNode* cur, int targetSum, int sum)
{
if (cur->left==nullptr && cur->right==nullptr)
{
if (sum==targetSum) ans = true;
return;
}
if (cur->left!=nullptr)
{
dfs(cur->left, targetSum, sum+cur->left->val);
}
if (cur->right!=nullptr)
{
dfs(cur->right, targetSum, sum+cur->right->val);
}
}
bool hasPathSum(TreeNode* root, int targetSum)
{
ans = false;
int sum = 0;
if (root==nullptr) return ans;
dfs(root, targetSum, sum+root->val);
return ans;
}
};
class Solution {
public:
void dfs(TreeNode* cur, vector<vector<int>>& ans, vector<int> vec, int targetSum, int sum)
{
if (cur->left==nullptr && cur->right==nullptr)
{
if (sum==targetSum) ans.push_back(vec);
return;
}
if (cur->left!=nullptr)
{
vec.push_back(cur->left->val);
dfs(cur->left, ans, vec, targetSum,sum+cur->left->val);
vec.pop_back();
}
if (cur->right!=nullptr)
{
vec.push_back(cur->right->val);
dfs(cur->right, ans, vec, targetSum,sum+cur->right->val);
vec.pop_back();
}
}
vector<vector<int>> pathSum(TreeNode* root, int targetSum)
{
vector<vector<int>> ans;
vector<int> vec;
int sum = 0;
if (root==nullptr) return ans;
vec.push_back(root->val);
dfs(root, ans, vec, targetSum,sum+root->val);
return ans;
}
};
好好看一下,方法很巧妙
class Solution {
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder)
{
if (postorder.size()==0) return nullptr;
int lastnode = postorder[postorder.size()-1];
TreeNode* root = new TreeNode(lastnode);
if (postorder.size()==1) return root;
int inindex = 0;
for (inindex=0; inindex<inorder.size(); inindex++)
{
if (inorder[inindex]==lastnode) break;
}
vector<int> left_inorder = vector<int>(inorder.begin(), inorder.begin()+inindex);
vector<int> right_inorder = vector<int>(inorder.begin()+inindex+1, inorder.end());
postorder.resize(postorder.size()-1);
vector<int> left_postorder = vector<int>(postorder.begin(), postorder.begin()+left_inorder.size());
vector<int> right_postorder = vector<int>(postorder.begin()+left_postorder.size(), postorder.end());
root->left = buildTree(left_inorder, left_postorder);
root->right = buildTree(right_inorder, right_postorder);
return root;
}
};
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder)
{
if (preorder.size()==0) return nullptr;
int lastnode = preorder[0];
TreeNode* root = new TreeNode(lastnode);
if (preorder.size()==1) return root;
int inindex = 0;
for (inindex=0; inindex<inorder.size(); inindex++)
{
if (inorder[inindex]==lastnode) break;
}
vector<int> left_inorder = vector<int>(inorder.begin(), inorder.begin()+inindex);
vector<int> right_inorder = vector<int>(inorder.begin()+inindex+1, inorder.end());
vector<int> pre = vector<int>(preorder.begin()+1, preorder.end());
vector<int> left_postorder = vector<int>(pre.begin(), pre.begin()+left_inorder.size());
vector<int> right_postorder = vector<int>(pre.begin()+left_inorder.size(), pre.end());
root->left = buildTree(left_postorder, left_inorder);
root->right = buildTree(right_postorder, right_inorder);
return root;
}
};