- 层序遍历到倒数第二层,入最后一层的队列时,返回查找到的第一个非空孩子节点。
int findBottomLeftValue(TreeNode* root) {
int res = 0;
if(!root) return res;
if(root->left == NULL && root->right == NULL) return root->val;
queue<TreeNode*> level;
level.push(root);
int high = 0;
int flag = 0;
while(!level.empty()){
high++;
int size = level.size();
for(int i = 0; i < size; i++){
TreeNode * tmp = level.front();
level.pop();
if(tmp->left) level.push(tmp->left);
if(tmp->right) level.push(tmp->right);
}
}
level.push(root);
int newhigh = 0;
while(!level.empty()){
newhigh++;
int size = level.size();
if(newhigh == high-1){
for(int i = 0; i < size; i++){
TreeNode * tmp = level.front();
level.pop();
if(tmp->left) return tmp->left->val;
if(tmp->right) return tmp->right->val;
}
}
else{
for(int i = 0; i < size; i++){
TreeNode * tmp = level.front();
level.pop();
if(tmp->left) level.push(tmp->left);
if(tmp->right) level.push(tmp->right);
}
}
}
return res;
}
- 递归方式,结果有点凑巧。
bool solSum(TreeNode* root, int sum, int targetSum){
if(root == NULL) return false;
sum += root->val;
if(root->left == NULL && root->right==NULL) {
if(sum == targetSum) return true;
else return false;
}
bool s1 = solSum(root->left, sum, targetSum);
if(s1) return true;
bool s2 = solSum(root->right, sum, targetSum);
if(s2) return true;
return false;
}
bool hasPathSum(TreeNode* root, int targetSum) {
int sum = 0;
if(!root) return false;
bool res = solSum(root, sum,targetSum);
return res;
}
- 后序是 左右中,递归注意顺序。
- 递归的结束条件和返回值。
TreeNode* build(vector<int>& inorder, int begin, int end,vector<int>& postorder, int pend){
if(begin > end || pend < 0){ return NULL;}
int insertNum = postorder[pend], pos = 0;
TreeNode* root = new TreeNode(insertNum);
for(int i = begin; i <= end; i++){
if(inorder[i] == insertNum) pos = i;
}
postorder.resize(postorder.size() - 1);
root->right = build(inorder, pos+1, end, postorder, postorder.size()-1);
root->left = build(inorder, begin, pos-1, postorder,postorder.size()-1);
return root;
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if(postorder.size() == 0) return NULL;
return build(inorder, 0, inorder.size()-1, postorder, postorder.size()-1);
}
TreeNode* build(vector<int>& preorder, vector<int>& inorder, int begin, int end){
if(begin > end) return NULL;
int insertRes = preorder[0], pos = 0;
TreeNode* root = new TreeNode(insertRes);
preorder.erase(preorder.begin(), preorder.begin()+1);
for(int i = begin; i <= end; i++){
if(inorder[i] == insertRes) pos = i;
}
root->left = build(preorder, inorder, begin, pos - 1);
root->right = build(preorder, inorder, pos+1, end);
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.size() == 0) return NULL;
return build(preorder, inorder, 0, inorder.size()-1);
}