513.找树左下角的值
力扣题目链接
int find(TreeNode* root) {
queue<TreeNode*> que;
int res;
if (root != NULL) {
que.push(root);
}
while (!que.empty()) {
int size = que.size();
for (int i = 0; i < size; ++i) {
TreeNode* node = que.front();
que.pop();
if (i == 0) {
res = node->val;
}
if (node->left) {
que.push(node->left);
}
if (node->right) {
que.push(node->right);
}
}
}
return res;
}
int findBottomLeftValue(TreeNode* root) {
int result = find(root);
return result;
}
int maxDepth = INT16_MIN;
int result;
void traversal(TreeNode* root, int depth) {
if (root->left == NULL && root->right == NULL) {
if (depth > maxDepth) {
maxDepth = depth;
result = root->val;
}
}
if (root->left) {
depth++;
traversal(root->left, depth);
depth--;
}
if (root->right) {
depth++;
traversal(root->right, depth);
depth--;
}
}
int findBottomLeftValue1(TreeNode* root) {
traversal(root, 0);
return result;
}
112. 路径总和
力扣题目链接
bool traversal(TreeNode* cur, int count) {
if (!cur->left && !cur->right && count == 0) {
return true;
}
if (!cur->left && !cur->right) {
return false;
}
if (cur->left) {
count -= cur->left->val;
if (traversal(cur->left, count)) {
return true;
}
count += cur->left->val;
}
if (cur->right) {
count -= cur->right->val;
if (traversal(cur->right, count)) {
return true;
}
count += cur->right->val;
}
return false;
}
bool hasPathSum(TreeNode* root, int targetSum) {
if (root == NULL) {
return false;
}
return traversal(root, targetSum - root->val);
}
bool haspathsum(TreeNode* root, int sum) {
if (root == NULL) {
return false;
}
stack<pair<TreeNode*, int>> st;
st.push(pair<TreeNode*, int>(root, root->val));
while (!st.empty()) {
pair<TreeNode*, int> node = st.top();
st.pop();
if (!node.first->left && !node.first->right && sum == node.second) {
return true;
}
if (node.first->right) {
st.push(pair<TreeNode*, int> (node.first->right, node.second + node.first->right->val));
}
if (node.first->left) {
st.push(pair<TreeNode*, int>(node.first->left, node.second + node.first->left->val));
}
}
return false;
}
113. 路径总和ii
力扣题目链接
vector<vector<int>> result;
vector<int> path;
void traversal(TreeNode* cur, int count) {
if (!cur->left && !cur->right && count == 0) {
result.push_back(path);
return;
}
if (!cur->left && !cur->right) {
return;
}
if (cur->left) {
path.push_back(cur->left->val);
count -= cur->left->val;
traversal(cur->left, count);
count += cur->left->val;
path.pop_back();
}
if (cur->right) {
path.push_back(cur->right->val);
count -= cur->right->val;
traversal(cur->right, count);
count += cur->right->val;
path.pop_back();
}
return ;
}
public:
vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
result.clear();
path.clear();
if (root == NULL) {
return result;
}
path.push_back(root->val);
traversal(root, targetSum - root->val);
return result;
}
106.从中序与后序遍历序列构造二叉树
力扣题目链接
TreeNode* traversal(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 delimiterIndex;
for (delimiterIndex = 0; delimiterIndex < inorder.size(); delimiterIndex++) {
if (inorder[delimiterIndex] == rootVal) {
break;
}
}
vector<int> leftInorder(inorder.begin(), inorder.begin() + delimiterIndex);
vector<int> rightInorder(inorder.begin() + delimiterIndex + 1, inorder.end());
postorder.resize(postorder.size() - 1);
vector<int> leftPostorder(postorder.begin(), postorder.begin() + leftInorder.size());
vector<int> rightPostorder(postorder.begin() + leftInorder.size(), postorder.end());
root->left = traversal(leftInorder, leftPostorder);
root->right = traversal(rightInorder, rightPostorder);
return root;
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
return traversal(inorder, postorder);
}
TreeNode* traversal(vector<int>& inorder, int inorderBegin, int inorderEnd, vector<int>& postorder, int postorderBegin, int postorderEnd) {
if (postorderBegin == postorderEnd) {
return NULL;
}
int rootVal = postorder[postorderEnd - 1];
TreeNode* root = new TreeNode(rootVal);
if (postorderEnd - postorderBegin == 1) {
return root;
}
int delimiterIndex;
for (delimiterIndex = inorderBegin; delimiterIndex < inorderEnd; ++delimiterIndex) {
if (inorder[delimiterIndex] == rootVal) {
break;
}
}
int leftInBegin = inorderBegin;
int leftInEnd = delimiterIndex;
int rightInBegin = delimiterIndex + 1;
int rightInEnd = inorderEnd;
int leftPostBegin = postorderBegin;
int leftPostEnd = postorderBegin + delimiterIndex - inorderBegin;
int rightPostBegin = postorderBegin + delimiterIndex - inorderBegin;
int rightPostEnd = postorderEnd - 1;
root->left = traversal(inorder, leftInBegin, leftInEnd, postorder, leftPostBegin, leftPostEnd);
root->right = traversal(inorder, rightInBegin, rightInEnd, postorder, rightPostBegin, rightPostEnd);
return root;
}
TreeNode* buildTree1(vector<int>& inorder, vector<int>& postorder) {
if (inorder.size() == 0 || postorder.size() == 0) {
return NULL;
}
return traversal(inorder, 0, inorder.size(), postorder, 0, postorder.size());
}
105.从前序与中序遍历序列构造二叉树
力扣题目链接
TreeNode* traversal(vector<int>& preorder, vector<int>& inorder) {
if (preorder.size() == 0 || inorder.size() == 0) {
return NULL;
}
int rootVal = *preorder.begin();
TreeNode* root = new TreeNode(rootVal);
if (preorder.size() == 1) {
return root;
}
int delimiterIndex = -1;
for (int i = 0; i < inorder.size(); ++i) {
if (inorder[i] == rootVal) {
delimiterIndex = i;
break;
}
}
vector<int> leftInorder(inorder.begin(), inorder.begin() + delimiterIndex);
vector<int> rightInorder(inorder.begin() + delimiterIndex + 1, inorder.end());
vector<int> leftPreorder(preorder.begin() + 1, preorder.begin() + delimiterIndex + 1);
vector<int> rightPreorder(preorder.begin() + delimiterIndex + 1, preorder.end());
root->left = traversal(leftPreorder, leftInorder);
root->right = traversal(rightPreorder, rightInorder);
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
return traversal(preorder, inorder);
}