513. 找树左下角的值
题目
给定一个二叉树的 根节点 root
,请找出该二叉树的 最底层 最左边 节点的值。
假设二叉树中至少有一个节点。
解析
可以用层次遍历,每次新的一行的开始都将结构赋值,走到最后一层的时候就会将最终结果赋值。
Java代码实现
public int findBottomLeftValue(TreeNode root) {
if (root == null) {
return 0;
}
Queue<TreeNode> queue = new ArrayDeque<>();
queue.offer(root);
int result = 0;
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
if (i == 0) {
result = node.val;
}
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
}
return result;
}
112. 路径总和
题目
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
叶子节点 是指没有子节点的节点。
解析
关键点每次到叶子节点的时候判断一下目标整数是否减到了0。
Java代码实现
public boolean hasPathSum(TreeNode root, int targetSum) {
if (root == null) {
return false;
}
targetSum -= root.val;
if (root.left == null && root.right == null) {
return targetSum==0;
}
if (root.left != null) {
boolean left = hasPathSum(root.left, targetSum);
if (left) {
return true;
}
}
if (root.right != null) {
boolean right = hasPathSum(root.right, targetSum);
if (right) {
return true;
}
}
return false;
}
106. 从中序与后序遍历序列构造二叉树
题目
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
解析
从后序遍历中获取到二叉树的“根节点”,然后再根据中序遍历的去拆分左子树和右子树。
Java代码实现
Map<Integer, Integer> map = new HashMap<>();
public TreeNode buildTree(int[] inorder, int[] postorder) {
for (int i = 0; i < inorder.length; i++) {
map.put(inorder[i], i);
}
return build(inorder, 0, inorder.length, postorder, 0, postorder.length);
}
private TreeNode build(int[] inorder, int inorderStart, int inorderEnd, int[] postorder, int postorderStart, int postorderEnd) {
if (inorderStart >= inorderEnd || postorderStart >= postorderEnd) {
return null;
}
int rootIndex = map.get(postorder[postorderEnd - 1]);
TreeNode node = new TreeNode(inorder[rootIndex]);
int leftLen = rootIndex - inorderStart;
node.left = build(inorder, inorderStart, rootIndex, postorder, postorderStart, postorderStart + leftLen);
node.right = build(inorder, rootIndex + 1, inorderEnd, postorder, postorderStart + leftLen, postorderEnd - 1);
return node;
}