递归解题核心思想
1、递归要考虑的三个问题:
递归应该在什么时候结束?
我应该返回什么信息给上层?
在这一次的递归中,要完成什么任务?
递归每一层的功能都是一样的,所以只要解决了这三个问题,递归的问题就解决了
2、举例说明:
2.1、二叉树的最大深度
1、什么时候结束递归?
当遍历到树的左右节点都为空的时候,递归就结束了!
2、返回给上层的是什么?
因为是对树深度的遍历,所以返回给上层的,自然是这颗子树的深度
3、本次递归中,要完成什么任务?
每一次的递归,都是在获取树的深度,可能左右子树都存在,那么自然要返回最高的那颗树的值,同时,要加上1,因为本身的这棵树,也属于一层,当遍历到自身为null的时候,就返回0(不用+1)
4、代码如下:
public int maxDepth(TreeNode root) {
if (root == null){
return 0;
}
int left = maxDepth(root.left);
int right = maxDepth(root.right);
return left > right ? left + 1 : right + 1;
}
2.2、两两交换链表中的节点
问题描述:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
1、什么时候结束递归?
当已经到了最后的元素,不能再交换了,结束递归
2、返回给上层的是什么?
交换后的链表,把两个链表进行交换后,返回给上一层
3、本次递归中,要完成什么任务?
递归值考虑一层,也就意味着,我们眼中的一条链表,分成了三个部分
head-->head.next-->已经处理好的链表部分,我们要做的,自然就是把head和head.next进行交换
4、代码实现
if (head == null || head.next == null) {
return head;
}
/**
* 用temp做中间临时变量
*/
ListNode temp = head.next;
//把排序好的链表,挂到head节点的next上面
head.next = swapPairs(temp.next);
//把head,挂到临时变量的next上面
temp.next = head;
return temp;
2.3、判断二叉树是否高度平衡
1、什么时候结束递归?
当左子树或右子树不为平衡二叉树时,或遍历完所有节点
2、返回给上层的是什么?
本层的子树,是否是一颗平衡二叉树
3、本次递归中,要完成什么任务?
计算本层的高度差,并判断本层的左子树和右子树是否是一个平衡二叉树
4、代码实现
/**
* 遍历左右子树的同时,计算左右子树的是否是个平衡二叉树
* @param root
* @return
*/
public boolean isBalanced(TreeNode root) {
if (root == null){
return true;
}else {
//返回当前树的高度差是否小于等于1
return (Math.abs(maxHeight(root.left) - maxHeight(root.right)) <= 1)
//判断左子树和右子树,是否都是平衡的二叉树
&& isBalanced(root.left) && isBalanced(root.right) ;
}
}
//求树深度
int maxHeight(TreeNode root){
return root == null ? 0 : Math.max(maxHeight(root.left),maxHeight(root.right)) + 1;
}
本文参考lyl大佬的博客,发表自己的意见,感谢lyl大佬提供的思路!