可喜可贺,似乎记下了层序遍历的规律,一次通过
int findBottomLeftValue(struct TreeNode* root){
int num = 0, count = 0;
struct TreeNode *queue[10000];
int head = 0, tail = 0;
queue[tail++] = root;
while (head < tail)
{
int start = head;
head = tail;
for (int i=start; i<head; i++)
{
if (queue[i]->left) queue[tail++] = queue[i]->left;
if (queue[i]->right) queue[tail++] = queue[i]->right;
}
count = start;
}
num = queue[count]->val;
return num;
}
原来这就是回溯
ool traversal(struct TreeNode* root, int targetSum)
{
if (!root->left && !root->right)
{
if (0 == targetSum)
{
return true;
}else {
return false;
}
}
if (root->left)
{
targetSum -= root->left->val;
if (traversal(root->left, targetSum)) return true;
targetSum += root->left->val;
}
if (root->right)
{
targetSum -= root->right->val;
if (traversal(root->right, targetSum)) return true;
targetSum += root->right->val;
}
return false;
}
bool hasPathSum(struct TreeNode* root, int targetSum){
if (!root) return false;
return traversal(root, targetSum - root->val);
}
画图,不会就画图
struct TreeNode* buildTree(int* inorder, int inorderSize, int* postorder, int postorderSize){
if (!postorderSize) return NULL;
struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->val = postorder[postorderSize - 1];
int left;
for (left = 0; left < inorderSize; left++)
{
if (inorder[left] == root->val) break;
}
int right = inorderSize - left - 1;
root->left = buildTree(inorder, left, postorder, left);
root->right = buildTree(inorder+left+1, right, postorder+left, right);
return root;
}