513.找树左下角的值
1.题目:
给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。
假设二叉树中至少有一个节点。
示例 1:
输入: root = [2,1,3]
输出: 1
示例 2:
输入: [1,2,3,4,null,5,6,null,null,7]
输出: 7
2.思想:
3.代码:
int res=0;
int maxdeep=Integer.MIN_VALUE;
public int findBottomLeftValue(TreeNode root) {
//递归
res=root.val;
traversal(root,0);
return res;
}
public void traversal(TreeNode root,int deep){
if(root==null){
return;
}
if(root.left==null &&root.right==null){
if(deep>maxdeep){
res=root.val;
maxdeep=deep;
}
}
if(root.left!=null){
deep++;
traversal(root.left,deep);
deep--;
}
if(root.right!=null){
deep++;
traversal(root.right,deep);
deep--;
}
}
public int findBottomLeftValue(TreeNode root) {
//层序遍历
int res=0;
Queue<TreeNode> queue=new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
int size=queue.size();
for(int i=0;i<size;i++){
TreeNode pop=queue.poll();
if(i==0){
res=pop.val;
}
if(pop.left!=null){
queue.offer(pop.left);
}
if(pop.right!=null){
queue.offer(pop.right);
}
}
}
return res;
}
4.总结:
112. 路径总和
1.题目:
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。
2.思想:
3.代码:
public boolean hasPathSum(TreeNode root, int targetSum) {
//递归
if(root==null){
return false;
}
return traversal(root,targetSum-root.val);
}
public boolean traversal(TreeNode root, int sum){
if(root.left==null && root.right ==null && sum==0){
return true;
}
if(root.left==null &&root.right==null){
return false;
}
if(root.left!=null){
sum-=root.left.val;
if(traversal(root.left,sum)){
return true;
}
sum+=root.left.val;
}
if(root.right!=null){
sum-=root.right.val;
if(traversal(root.right,sum)){
return true;
}
sum+=root.right.val;
}
return false;
}
4.总结:
113.路径总和ii
1.题目:
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]
2.思想:
3.代码:
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
//递归
List<List<Integer>> res=new ArrayList<>();
List<Integer> path=new LinkedList<>();
if(root==null){
return res;
}
traversal(root,res,path,targetSum);
return res;
}
public void traversal(TreeNode root,List<List<Integer>> res,List<Integer> path,int sum){
path.add(root.val);
if(root.left==null &&root.right==null){
if(sum-root.val==0){
res.add(new ArrayList<>(path));
}
return;
}
if(root.left!=null){
traversal(root.left,res,path,sum-root.val);
path.remove(path.size()-1);
}
if(root.right!=null){
traversal(root.right,res,path,sum-root.val);
path.remove(path.size()-1);
}
}
4.总结:
106.从中序与后序遍历序列构造二叉树
1.题目:
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
输出:[3,9,20,null,null,15,7]
2.思想:
3.代码:
public TreeNode buildTree(int[] inorder, int[] postorder) {
if(inorder.length==0){
return null;
}
TreeNode root=new TreeNode(postorder[postorder.length-1]);
for(int i=0;i<inorder.length;i++){
if(root.val==inorder[i]){
int[] inorderleft=Arrays.copyOfRange(inorder,0,i);
int[] inorderright=Arrays.copyOfRange(inorder,i+1,inorder.length);
int[] postorderleft=Arrays.copyOfRange(postorder,0,i);
int[] postorderright=Arrays.copyOfRange(postorder,i,postorder.length-1);
root.left=buildTree(inorderleft,postorderleft);
root.right=buildTree(inorderright,postorderright);
}
}
return root;
}
4.总结:
105.从前序与中序遍历序列构造二叉
1.题目:
给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
示例 1:
输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]
2.思想:
3.代码:
public TreeNode buildTree(int[] preorder, int[] inorder) {
if(preorder.length==0){
return null;
}
//创建根节点
int rootvalue=preorder[0];
TreeNode root=new TreeNode(rootvalue);
//根据根节点找到左右子树
for(int i=0;i<inorder.length;i++){
if(inorder[i]==rootvalue){
int[] inleft=Arrays.copyOfRange(inorder,0,i);
int[] inright=Arrays.copyOfRange(inorder,i+1,inorder.length);
int[] preleft=Arrays.copyOfRange(preorder,1,i+1);
int[] preright=Arrays.copyOfRange(preorder,i+1,preorder.length);
root.left=buildTree(preleft,inleft);
root.right=buildTree(preright,inright);
}
}
return root;
}
4.总结: