代码随想录算法训练营第十六天| 513.找树左下角的值 112. 路径总和 106、从中序与后序遍历序列构造二叉树
Leetcode 513.找树左下角的值
题目链接:https://leetcode.cn/problems/find-bottom-left-tree-value/description/
思路一:递归
思路二:迭代法(层序遍历)
代码1:递归
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int Deep = -1;
int Value = 0;
public int findBottomLeftValue(TreeNode root) {
// 递归
// 采用前中后序都可以
// 取一个最小深度值
Value = root.val;
findLeftValue(root, 0);
return Value;
}
// 确定参数和返回值
public void findLeftValue(TreeNode root , int deep){
// 终止条件
if(root == null) return;
if(root.left == null && root.right == null){
if(deep > Deep){
Deep = deep;
Value = root.val;
}
}
if(root.left!= null) findLeftValue(root.left , deep + 1);
if(root.right!=null) findLeftValue(root.right , deep + 1);
}
}
代码二:层序遍历
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int findBottomLeftValue(TreeNode root) {
// 迭代法
// 使用层序遍历
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int res = 0;
while(!queue.isEmpty()){
int size = queue.size();
for(int i = 0 ; i<size ; i++){
TreeNode poll = queue.poll();
if(i == 0){
res = poll.val;
}
if(poll.left != null) queue.offer(poll.left);
if(poll.right != null) queue.offer(poll.right);
}
}
return res;
}
}
总结:
Leetcode 112、路径总和
题目链接:https://leetcode.cn/problems/path-sum/description/
题目描述:
给你二叉树的根节点 root
和一个表示目标和的整数 targetSum
。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum
。如果存在,返回 true
;否则,返回 false
。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。
示例 2:
输入:root = [1,2,3], targetSum = 5
输出:false
解释:树中存在两条根节点到叶子节点的路径:
(1 --> 2): 和为 3
(1 --> 3): 和为 4
不存在 sum = 5 的根节点到叶子节点的路径。
示例 3:
输入:root = [], targetSum = 0
输出:false
解释:由于树是空的,所以不存在根节点到叶子节点的路径。
思路 :
1、递归法
2、迭代法
代码1:递归
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
// 确定返回值和参数
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;
}
}
总结:
设置目标值为节点和,采用减减的方式判断是否存在路径
Leetcode 106、从中序与后序遍历序列构造二叉树
题目链接:
(https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/)
题目描述:
给定两个整数数组 inorder
和 postorder
,其中 inorder
是二叉树的中序遍历, postorder
是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
示例 1:
输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
输出:[3,9,20,null,null,15,7]
示例 2:
输入:inorder = [-1], postorder = [-1]
输出:[-1]
代码:递归
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
Map<Integer,Integer> map;
// 方便根据数值查找位置
public TreeNode buildTree(int[] inorder, int[] postorder) {
map = new HashMap<>();
for(int i = 0 ; i< inorder.length; i++){
// 用map保存中序序列的数值对应位置
map.put(inorder[i],i);
}
return findNode(inorder, 0 ,inorder.length,postorder,0,postorder.length);
}
public TreeNode findNode(int[] inorder,int inBegin, int inEnd,int[] postorder,int postBegin, int postEnd){
// 参数内的范围都是左闭右开
if(inBegin >= inEnd || postBegin >= postEnd){
// 不满足左闭右开
return null;
}
int rootIndex = map.get(postorder[postEnd - 1]);
// 找到后序遍历的最后一个元素在中序遍历中的位置
TreeNode root = new TreeNode(inorder[rootIndex]);
// 构造节点
// 保存中序左子树的个数,用来确定后序数列的个数
int lenOfLeft = rootIndex - inBegin;
root.left = findNode(
inorder,
inBegin,
rootIndex,
postorder,
postBegin,
postBegin + lenOfLeft
);
root.right = findNode(
inorder,
rootIndex + 1,
inEnd,
postorder,
postBegin + lenOfLeft,
postEnd - 1
);
return root;
}
}
rootIndex + 1,
inEnd,
postorder,
postBegin + lenOfLeft,
postEnd - 1
);
return root;
}
}