需求:
给定一个二叉树[3,9,20,null,null,15,7],计算出它的最大深度。
分析:
如果仅仅是依据上面的一句话,让你直接写代码,猛然间,好像不知道如何下手...这是因为平常我们在工作中写的代码都是简单的定义几个类,然后注入,写业务代码,就可以直接使用了。针对上面这个需求,我们需要做如下几个步骤:
1、要想用代码写出来,就需要运用我们的抽象思维,想想用什么数据结构来实现。
2、结合二叉树的一些知识,二叉树各个节点上面有一个整形值,然后每个节点下面由左子树(可为空)和右子树(可为空)组成,我们可以定义一个类Node,然后在里面再定义一个整形变量,和两个Node类型的实例变量。
3、定义好数据结构之后,紧接着就要设计算法来实现了,结合二叉树的特点,这里用递归实现。
4、定义好之后,就可以造点数据来测试验证了。
源码:
public static void main(String[] args) {
Node root = initializeData();
int maxDepth = calculateMaxDepth(root);
System.out.println(maxDepth);
}
private static int calculateMaxDepth(Node node) {
if (node == null) {
return 0;
}
System.out.println(node.getValue());//输出当前节点的值
int leftDepth = calculateMaxDepth(node.getNodeLeft())+1;//左子树的深度(左子树也包括右子树(参考二叉树定义))
int rightDepth = calculateMaxDepth(node.getNodeRight())+1;//右子树的深度(右子树也包括左子树(参考二叉树定义))
return Math.max(leftDepth,rightDepth);//针对根节点的左子树比较一次左和右的大小,同样针对根节点的右子树比较一次左和右的大小,然后比较最终的大小
}
private static Node initializeData() {
Node root = new Node(3);
Node node9 = new Node(9);
Node node20 = new Node(20);
Node node15 = new Node(15);
Node node7 = new Node(7);
// Node node30 = new Node(30);
// Node node31 = new Node(31);
root.setNodeLeft(node9);
root.setNodeRight(node20);
node20.setNodeLeft(node15);
node20.setNodeRight(node7);
// node9.setNodeLeft(node30);
// node9.setNodeRight(node31);
return root;
}
总结:
其实递归这个算法,我自己感觉刚开始的时候是不太好理解的。必须去打断点,一步一步的去跟踪,慢慢的体会它的思想。递归的本质其实是栈的调用,会把某一次调用涉及到的变量值和中间结果,都暂存起来,当最后一次调用结束时会一层一层的返回,最终执行完,结合它的本质思想,会好理解一点。把握当下,起点就是当下。觉察即自由。
网友评论