代码随想录 (programmercarl.com)
513.找树左下角的值
本题使用层序遍历再合适不过了,比递归要好理解得多!
只需要记录最后一行第一个节点的数值就可以了。
关键: if (i == 0){ //得到每一行的第一个元素
res = node.val;
}
class Solution {
public int findBottomLeftValue(TreeNode root) {
int res = 0;
Deque<TreeNode> dq = new LinkedList<>();
if (root != null){
dq.offer(root);
}
while (!dq.isEmpty()){
int size = dq.size();
for (int i = 0; i < size; i++) {
TreeNode node = dq.poll();
if (i == 0){//得到每一行的第一个元素
res = node.val;
}
if (node.left != null){
dq.offer(node.left);
}
if (node.right != null){
dq.offer(node.right);
}
}
}
return res;
}
}
112.路经总和
没必要遍历所有的节点,只要符合结果就返回。
用targetSum不断去-遍历到的节点,直到遇到叶子节点即可结束遍历进行判断。
class Solution {
public boolean hasPathSum(TreeNode root, int targetSum) {
if(root == null){
return false;
}
if(root.left == null && root.right == null){//递归终止条件
return targetSum == 0;
}
if (root.left != null){
targetSum -= root.left.val;
if (hasPathSum(root.left, targetSum)){
return true;
}
targetSum += root.left.val;//回溯
}
if (root.right != null){
targetSum -= root.right.val;
if(hasPathSum(root.right, targetSum)){
return true;
}
targetSum += root.right.val;//回溯
}
return false;
}
}
113.路径总和Ⅱ
106.从中序与后序遍历序列构造二叉树
后序遍历找到根节点,再根据中序遍历找到左右子树。