一、二叉树的右视图(遍历)
给定一个二叉树的 根节点 root
,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
(如果右子树为空的话,那么右视图中看到的就是左子树的节点)
bfs层序遍历:
思路:
需要用到一个队列,然后把每一层中的节点添加到队列中,遍历到最后一个节点的时候就是最右边的,添加到res中即可。
代码:
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> res=new ArrayList<>();
Queue<TreeNode> queue=new ArrayDeque<>();
if(root==null)return res;
queue.add(root);
while(!queue.isEmpty()){
int size=queue.size();
for(int i=0;i<size;i++){
TreeNode cur=queue.poll();
if(cur.left!=null)queue.add(cur.left);
if(cur.right!=null)queue.add(cur.right);
if(i==size-1)res.add(cur.val);
}
}
return res;
}
}
dfs右序遍历
思路:
因为题目中要求我们返回右视图的结果集。因此我们首先递归右子树,然后再去递归左子树。
如果右子节点一直存在的话,那么就一直往下dfs搜索,添加到res中;
如果右子节点为null的话,那么就向上返回,往左递归。注意这里要判断当前的深度和res的大小。只有depth==res.size()时,说明该层该元素是第一个访问的。
代码:
class Solution {
List<Integer> res=new ArrayList<>();
public List<Integer> rightSideView(TreeNode root) {
dfs(root,0);
return res;
}
public void dfs(TreeNode root,int depth){
if(root==null)return;
if(res.size()==depth){
res.add(root.val);//每一层只能添加一个子节点
}
depth++;
dfs(root.right,depth);
dfs(root.left,depth);
}
}
二、路经总和
给你二叉树的根节点 root
和一个表示目标和的整数 targetSum
。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum
。如果存在,返回 true
;否则,返回 false
。
思路:
1.首先题目要求我们的是从根节点到叶子节点,所以我们写终止条件的时候一定要写叶子结点的终止条件,如下:
if(root==null)return false;
if(root.left==null&&root.right==null)return targetSum==root.val;
我第一次写成了
if(root==null)return targetSum==0;
这样就会导致和题意不符合,就不是根节点到叶子节点了。
2.然后,就向左右子节点遍历即可,但是要注意的是,要先判断左右子节点是否为空。
boolean left=false;
boolean right=false;
if(root.left!=null)left=dfs(root.left,targetSum-root.val);
if(root.right!=null)right=dfs(root.right,targetSum-root.val);
代码:
class Solution {
public boolean hasPathSum(TreeNode root, int targetSum) {
if(root==null)return false;
return dfs(root,targetSum);
}
public boolean dfs(TreeNode root,int targetSum){
if(root==null)return false;
if(root.left==null&&root.right==null)return targetSum==root.val;
boolean left=false;
boolean right=false;
if(root.left!=null)left=dfs(root.left,targetSum-root.val);
if(root.right!=null)right=dfs(root.right,targetSum-root.val);
return left||right;
}
}
三、二叉树最小深度
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。
dfs深搜:
思路:
我们要找到根节点到叶子节点中的最短路径。那我们就要去判断每次遍历的节点。
如果是叶子节点,返回1;
如果是null,返回0;
如果左右节点有一个为空,那么就返回非空那边的深度;
如果两个都不为空,那么就返回其中的较小值。
代码:
class Solution {
public int minDepth(TreeNode root) {
if(root==null)return 0;
int leftDepth=minDepth(root.left);
int rightDepth=minDepth(root.right);
//如果一边为空 或者都不为空
if(root.left==null||root.right==null)return leftDepth+rightDepth+1;
//如果两边都为空 就是一个叶子节点
return Math.min(leftDepth,rightDepth)+1;
}
}
bfs广搜:
思路:
层序遍历的思路
代码:
class Solution {
public int minDepth(TreeNode root) {
if(root==null)return 0;
int res=0;
Queue<TreeNode> queue=new ArrayDeque<>();
queue.add(root);
while(!queue.isEmpty()){
int size=queue.size();
res++;
for(int i=0;i<size;i++){
TreeNode cur=queue.poll();
if(cur.left==null&&cur.right==null)return res;
if(cur.left!=null)queue.add(cur.left);
if(cur.right!=null)queue.add(cur.right);
}
}
return res;
}
}
四、求根节点到叶节点数字之和
给你一个二叉树的根节点 root
,树中每个节点都存放有一个 0
到 9
之间的数字。
每条从根节点到叶节点的路径都代表一个数字:
- 例如,从根节点到叶节点的路径
1 -> 2 -> 3
表示数字123
。
计算从根节点到叶节点生成的 所有数字之和 。叶节点 是指没有子节点的节点。
思路:
如果遍历到第x个节点,我们需要把值求出来,然后传给下一个节点,下一个节点*10+root.val之后,再传给下一个节点。当遇到节点为叶子结点的时候,就返回值。
代码:
public int dfs(TreeNode node,int cur){
if(node==null)return 0;
int newCur=cur*10+node.val;
if(node.left==null&&node.right==null)return newCur;
int leftNum=dfs(node.left,newCur);
int rightNum=dfs(node.right,newCur);
return leftNum+rightNum;
}