递归在二叉树问题中的应用
递归思想史一种重要思想,本文参考leetcode官网上的教程,使用递归来解决几个二叉树问题,学习递归的思想与应用。
1、Maximum Depth of Binary Tree
题目大意
求二叉树根节点到叶子节点的最大深度。
思路
算出根节点的左子树与右子树到叶子节点的最大深度,然后取它们的最大值再加一就是根节点到叶子节点的最大深度。
代码
/**
* 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 maxDepth(TreeNode root) {
if(root==null){
return ;
}
int leftDepth=maxDepth(root.left);
int rightDepth=maxDepth(root.right);
return Math.max(leftDepth,rightDepth)+1;
}
}
2、Symmetric Tree
题目大意
判断一棵二叉树是否镜像对称。
思路
使用queue,每次出队位置对称的两个节点,判断它们的值是否相等,如何再把它们位置对称的孩子节点入队。这样遍历完所有的节点,如果都是镜像对称的,则这棵二叉树是镜像对称的。
代码
/**
* 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 isSymmetric(TreeNode root) {
if(root==null){
return true;
}
Queue<TreeNode> queue=new LinkedList<>();
queue.offer(root.left);
queue.offer(root.right);
while(!queue.isEmpty()){
TreeNode left=queue.poll();
TreeNode right=queue.poll();
if(left==null&&right==null){
continue;
}
if(left==null||right==null||left.val!=right.val){
return false;
}
queue.offer(left.left);
queue.offer(right.right);
queue.offer(left.right);
queue.offer(right.left);
}
return true;
}
}
3、Path Sum
题目大意
给一个特定的值sum,判断二叉树有没有一条从根节点到叶子节点的路径,使得这条路径上所有节点值的和等于sum。
思路
从根节点出发,判断如果以根节点的孩子节点出发,有没有一条道叶子节点的路径,使得这这条路径上所有节点值的和为sum-root.val。
代码
/**
* 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 sum) {
if(root==null){
return false;
}
if(root.left==null&root.right==null&&root.val==sum){
return true;
}
return hasPathSum(root.left,sum-root.val)||hasPathSum(root.right,sum-root.val);
}
}