剑指Offer第十八天
回溯算法(中等)
题1:二叉数的深度
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
class Solution {
//回溯算法,把要返回的值定义在公共区域
int max = 0;
public int maxDepth(TreeNode root) {
helper(root, 0);
return max;
}
//递归逻辑,如果碰到null,就更新max,然后返回
private void helper(TreeNode root, int k){
if(root == null){
max = Math.max(k, max);
return;
}
k++;
helper(root.left, k);
helper(root.right, k);
}
}
//非递归解法,这道题递归解法太简单了,我这个菜逼都一遍过,所以面试很有可能让你写非递归的解法
//而且如果深度特别大,递归太深,会导致栈溢出,此时就需要考虑非递归的方法了
class Solution {
public int maxDepth(TreeNode root) {
if(root == null){
return 0;
}
//栈存放一个pair对象,对象的key表示当前节点,value表示当前节点的深度
Stack<Pair<TreeNode, Integer>> stack = new Stack<>();
stack.add(new Pair<>(root, 1));
int high = 0;
//套模板。。
while(!stack.isEmpty()){
Pair<TreeNode, Integer> pair = stack.pop();
high = Math.max(pair.getValue(), high);
if(pair.getKey().left != null){
stack.push(new Pair<>(pair.getKey().left, pair.getValue()+1));
}
if(pair.getKey().right != null){
stack.push(new Pair<>(pair.getKey().right, pair.getValue()+1));
}
}
return high;
}
}
题2:数据流中的中位数
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
class Solution {
public boolean isBalanced(TreeNode root) {
if(root == null){
return true;
}
if(Math.abs(helper(root.left)-helper(root.right))<=1){
//任意节点上都要保持平衡二叉树
return isBalanced(root.left) &&isBalanced(root.right);
}
return false;
}
//计算深度(后序遍历DFS)
private int helper(TreeNode root){
if(root == null){
return 0;
}
return Math.max(helper(root.left), helper(root.right))+1;
}
}