结合leetcode上的一些题,谈谈自己对树和递归的一些看法。
递归对喜欢简短代码的人来说是一种福利,递归一般分为从上往下和从下往上两种递归方法,拿最经典的斐波那契数列来说,要求f(n)的值,可以从f(n)往下推,f(n-1),f(n-2)...,这种方式很直观,但由于重复计算相同元素,所以在时间复杂度上是指数型增长,就个人所知道的情况而言,从上往下的时间复杂度不会优于从下往上的时间复杂度,故遇到递归的问题时,首先考虑从下往上的解法,也就是从f(0),f(1),f(2)...反推到f(n)。
下面说说二叉树,二叉树最经典也是最多考点的就是二叉树的遍历和二叉搜索树了(BST),而二叉树大部分的题便是用的递归解法。
先看leetcode上的Balanced Binary Tree,题意是判断一个树是否为平衡树。最优思路是利用递归方法,从叶节点开始逐层返回左右树结点的高度,同时判断是否为平衡树,若不为平衡树,则返回-1,若为平衡树,则返回树的高度,附上源码:
public class Solution {
public boolean isBalanced(TreeNode root) {
if (checkHeight(root) == -1){
return false;
}else {
return true;
}
}
public int checkHeight(TreeNode root){
if (root == null){
return 0;
}
int leftHeight = checkHeight(root.left);
if (leftHeight == -1){
return -1;
}
int rightHeight = checkHeight(root.right);
if (rightHeight == -1){
return -1;
}
int heightDiff = leftHeight - rightHeight;
if (Math.abs(heightDiff) > 1){
return -1;
}else {
return Math.max(leftHeight,rightHeight) + 1;
}
}
}