以下为TreeNode的结构
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
一: 对称二叉树
递归实现
首先确定其特点,是关于根节点对称的,从根节点开始,根节点的左右子节点是对称的,从第二层开始,该节点的左孩子节点与兄弟节点的右孩子节点对称,右孩子节点与兄弟节点的左孩子节点对称,下面可以通过上面这个规律对节点进行控制进行递归对比
首先明确递归结束条件:
(1)到达树的最后一层。
(2)遇到不符合条件,即不对称的情况直接结束递归。(1:一个节点为空,一个节点不为空。2:它们的值不同)
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null)
return true;
return recursive(root.left,root.right);
}
public boolean recursive(TreeNode root_left,TreeNode root_right){
if(root_left==null&&root_right==null)//到达最后一层结束递归,并且都为空,返回真
return true;
if(root_left==null||root_right==null||root_left.val!=root_right.val)//(1:一个节点为空,一个节点不为空。2:它们的值不同)
return false;
return recursive(root_left.left,root_right.right)&&recursive(root_left.right,root_right.left);//该节点的左孩子节点与兄弟节点的右孩子节点对称,右孩子节点与兄弟节点的左孩子节点对称,不断递归
}
}
迭代实现
按照规律对递归用队列稍加改造就可以写出来,原理一样,只不过,根节点需要入2次队,进行预处理,后面入队的顺序要控制好~左节点需要跟右节点在一起入队,另外当到达最后一层时,应该是continue而不是像递归一样直接return了
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null)
return true;
Queue<TreeNode>queue=new LinkedList<>();
queue.add(root);
queue.add(root);
while(!queue.isEmpty()){
TreeNode node1=queue.remove();
TreeNode node2=queue.remove();
if(node1==null&&node2==null)
continue;
if(node1==null||node2==null||node1.val!=node2.val)
return false;
queue.add(node1.left);
queue.add(node2.right);
queue.add(node1.right);
queue.add(node2.left);
}
return true;
}
}
二:二叉树深度
采用自底向上的思路进行求解,先递归到最下面的叶子节点,然后向上求解,每2个子节点向上的时候取最大值,在此基础上加上此根节点(加1),不断递归向上最后到达根部,得出结果
class Solution {
public int maxDepth(TreeNode root) {
if(root==null)
return 0;
int left = maxDepth(root.left);
int right = maxDepth(root.right);
return Math.max(left,right)+1;
}
}
三:路径总和
这个题目的意思就是找到一条路径它的和等于22,是从根节点到叶子结点才算一条路径
在这里解说一下标准递归解答的吧,首先递归得明确结束条件
(1)考虑特殊情况,根节点为空,直接结束递归
(2)找到符合情况的路径,结束递归
(3)当到了叶子节点,结束递归
然后分左,右子树分别递归
class Solution {
public boolean hasPathSum(TreeNode root, int sum) {
if(root==null)//结束条件(1)的特殊情况
return false;
sum-=root.val;//不为空,则进行处理,减去当前节点的值,为下面继续递归进行处理
if(root.left==null&&root.right==null)//当到了叶子结点,2个节点都为空时,进行判断,否则继续递归,其中一个为空时,下次递归开头会进行判断
return sum==0;
return hasPathSum(root.left,sum)||hasPathSum(root.right,sum);//只要其中一个为真则返回真
}
}