这题我还是没能够真正的求出深度,怎么说呢,因为这个代码求的时高度,从底层返回往上走,每次加一。不就是高度的理论嘛?深度不应该要从上面往下面走,所以我又继续研究的真正的求深度的代码!话不多说,整活!
public int maxDepth(TreeNode root) {
dfs(root);
return max;
}
int ans=0;
int max=0;
private void dfs(TreeNode root){
if(root==null){
if(max<ans){
max=ans;
}
return;
}
ans++;
dfs(root.left);
dfs(root.right);
--ans;
}
由于是前序遍历,往下遍历过后,程序还会往回走!所以这里得回溯。。
没遍历完一个节点,咱们就获取到最大深度。
我们再来看看,怎么样得到高度:
既然是高度,那么最上端的根节点就是最高的,所以就可以使用后续遍历,最后一个节点的值就是最大值,因为最后一个节点,绝对是根节点!!
public int maxDepth(TreeNode root) {
return dfs(root);
}
private int dfs(TreeNode root) {
if (root == null) {
return 0;
}
int l = dfs(root.left);
int r = dfs(root.right);
//上一层最高+1就是本层高度
return 1 + Math.max(l, r);
}
这玩意看着是真的简单,写着是真的难啊——————
我最先想到的还是层序遍历,最简单,得到多少层就好了:
public int maxDepth(TreeNode root) {
Queue<TreeNode> dui = new LinkedList<>();
int size = 0;
int ans = 0;
TreeNode p = null;
if (root != null) {
dui.offer(root);
} else {
return 0;
}
while (!dui.isEmpty()) {
size=dui.size();
ans++;
for (int i = 0; i < size; i++) {
p=dui.poll();
if(p.left!=null){
dui.offer(p.left);
}
if(p.right!=null){
dui.offer(p.right);
}
}
}
return ans;
}
注意!
千万不要把:
if(p.left!=null){
dui.offer(p.left);
}
if(p.right!=null){
dui.offer(p.right);
}写错了,不然你将会和我一样,寻找为毛死循环。。。。。。。。。。。