二叉树的双指针
1.相同的树
思路:递归的挨个比较是否相同
class Solution {public boolean isSameTree(TreeNode p, TreeNode q) {if((p == null&&q!=null) || (p != null && q == null) || (p!=null&&q!=null&&p.val != q.val)){return false;}if(p == q && p == null){return true;}boolean left = isSameTree(p.left,q.left);boolean right = isSameTree(p.right,q.right);return left&&right;}}
2.对称二叉树
思路:分别判断左边对称和右边对称即可
class Solution {public boolean isSymmetric(TreeNode root) {return trace(root.left,root.right);}public boolean trace(TreeNode left,TreeNode right) {if(left == null && right!=null){return false;}if(left != null && right==null){return false;}if(left == right){return true;}if(left.val != right.val){return false;}boolean l = trace(left.left,right.right);boolean r = trace(left.right,right.left);return l&&r;}}
3.合并二叉树
思路:递归三部曲
第一步:确定参数和返回值
显而易见,本题需要同步遍历两颗二叉树,TreeNode trace(TreeNode root1, TreeNode root2)
第二步:确定结束条件
当遇到root2为空或者root1为空就不需要再向下递归找相加了
第三步:确定单层逻辑
当root1和root2不为空,则两值相加
当root2为空,直接返回root1
当root1为空,直接返回root2
class Solution {public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {return trace(root1,root2);}public TreeNode trace(TreeNode root1, TreeNode root2) {if(root2 == null){return root1;}if(root1 != null && root2!=null){root1.val = root1.val + root2.val;}if(root1 == null && root2!= null){return root2;}root1.left = trace(root1.left,root2.left);root1.right = trace(root1.right,root2.right);return root1;}}
路径专题
1.二叉树的所有路径
思路:
第一步:确定参数和返回值
题目要求从根结点到叶子结点的所有路径,只需要下一个结点和字符串记录
void trace(TreeNode root,StringBuilder r)
第二步:确定结束条件
也就是什么时候找完一条路径,也就是什么时候找到叶子结点,也就是左右孩子都为空
第三步:确定单层逻辑
保存路径上的结点
class Solution { List<String> res = new LinkedList<>();public List<String> binaryTreePaths(TreeNode root) {String r = "";trace(root,r);return res;}public void trace(TreeNode root,String r){if(root == null){return;}r = r + root.val; if(root.left == null && root.right == null){res.add(r);return;}r = r+"->";trace(root.left,r);trace(root.right,r);}
}
2.路径总和
思路:递归三部曲
第一步:确定参数和返回值
题目要求找到是否有一条路径符合要求,返回boolean,需要参数记录路径之和还有目标值
boolean hasPathSum(TreeNode root,int res,int targetSum)
第二步:确定终止条件
当找到一条路径就结束
第三步:确定单层逻辑
当前路径求和
class Solution {public boolean hasPathSum(TreeNode root, int targetSum) {int res = 0;return hasPathSum(root,res,targetSum);}public boolean hasPathSum(TreeNode root,int res,int targetSum){if(root == null){return false;}res += root.val;if(root.left == null && root.right == null){if(res == targetSum){return true;}return false;}boolean left = hasPathSum(root.left,res,targetSum);boolean right = hasPathSum(root.right,res,targetSum);return left || right;}
}
翻转
思路:递归三部曲
第一步: 确定参数和返回值
翻转二叉树需要两两交换左右结点,遍历每一个结点进行交换即可。即参数root返回void
第二步:确定结束条件
结点为空
第三步:确定单层逻辑
每一个结点交换左右子树
class Solution {public TreeNode invertTree(TreeNode root) {trace(root);return root;}public void trace(TreeNode root){if(root == null){return;}TreeNode t = root.left;root.left = root.right;root.right = t;trace(root.left);trace(root.right);}
}