JZ82 二叉树中和为某一值的路径(一) ⭐
思路: 递归dfs,只要左子树和右子树里有一个有路径就成功。
public class Solution {
public boolean hasPathSum (TreeNode root, int sum) {
if (root == null ) return false;
if (root.left == null && root.right == null && sum == root.val) return true;
else return hasPathSum(root.left, sum - root.val) ||
hasPathSum(root.right, sum - root.val);
}
}
JZ34 二叉树中和为某一值的路径(二) ⭐⭐ 28%
思路:dfs
public class Solution {
static ArrayList<ArrayList<Integer>> result = new ArrayList<>();
static ArrayList<Integer> layer = new ArrayList<>();
public ArrayList<ArrayList<Integer>> FindPath (TreeNode root, int target) {
// dfs + 回溯
dfs(root, target);
return result;
}
public static void dfs(TreeNode p, int target) {
if (p == null) return;
layer.add(p.val);
if ((target -= p.val) == 0 && p.left == null && p.right == null) {
result.add(new ArrayList<Integer>(layer));
// 优化
layer.remove(layer.size() - 1);
return;
}
dfs(p.left, target);
dfs(p.right, target);
layer.remove(layer.size() - 1);
}
}
JZ36 二叉搜索树与双向链表 ⭐⭐ 31%
思路:每一个节点都和左子树的最右节点和右子树的最左节点相连。
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null)return null;//递归终点
TreeNode hNode; //保存最终的返回值
TreeNode leftHead=Convert(pRootOfTree.left); //递归左
TreeNode rightHead=Convert(pRootOfTree.right);//递归右
TreeNode node=leftHead;//用于寻找左链表的最后一个结点
if(rightHead != null){ //右链表比较好处理
pRootOfTree.right=rightHead;
rightHead.left=pRootOfTree;
}
if(node==null){
hNode=pRootOfTree;
}
else{
hNode=leftHead;
while(node.right!=null){ //注意左链表要找到tail结点
node=node.right;
}
node.right=pRootOfTree;
pRootOfTree.left=node;
}
return hNode;
}
}