513.找树左下角的值
代码部分:
int findBottomLeftValue(TreeNode* root) {
if(root == NULL) return 0;
queue<TreeNode*> q;
q.push(root);
int res = 0;
while(!q.empty()){
int s = q.size();
res = q.front()->val;
while(s--){
TreeNode* cur = q.front();
q.pop();
if(cur->left) q.push(cur->left);
if(cur->right) q.push(cur->right);
}
}
return res;
做题总结:
只考虑了层序遍历,简单粗暴,后面迭代啥的我再补。
112. 路径总和
贴代码:
bool hasPathSum(TreeNode* root, int targetSum) {
if(root == NULL) return false;
if(targetSum == root->val && !root->left && !root->right) return true;
targetSum -= root->val;
bool left = false, right = false;//这里直接定义出来而不在下面定义,是因为当若没有left或right不至于没有解
if(root->left) left = hasPathSum(root->left, targetSum);
if(root->right) right = hasPathSum(root->right, targetSum);
return (left || right);
}
106.从中序与后序遍历序列构造二叉树
TreeNode* func(vector<int>& m, vector<int>& b){
if(b.size() == 0) return NULL; //如果空节点则不必考虑这么多
int root_val = b[b.size() - 1];//先取后序节点生成root
TreeNode* root = new TreeNode(root_val);
if(b.size() == 1) return root;//如果后序遍历数组就一个,说明到叶子了,将这个节点就返回了
int m_index;
for(int i = 0; i < m.size(); i++){
if(m[i] == root_val) m_index = i;
}
//左闭右开
vector<int> l_m(m.begin(), m.begin() + m_index);//中序遍历左子树节点
vector<int> r_m(m.begin() + m_index + 1, m.end());//中序遍历右子树节点
b.resize(b.size() - 1);//弹出后序的最后一个
vector<int> l_b(b.begin(), b.begin() + l_m.size());//用中序的数组来切割约束后续
vector<int> r_b(b.begin() + l_m.size(), b.end());
root->left = func(l_m, l_b);//接收左子树
root->right = func(r_m, r_b);//接收右子树
return root;//将头结点弹出
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
return func(inorder, postorder);
}