剑指offer——二叉树的深度(虽然都是递归,但递归也有不同的写法,or循环)
来源:互联网 发布:惠勒延迟实验知乎 编辑:程序博客网 时间:2024/06/06 08:28
题目描述
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
思路:
给的入口是一个二叉树的根节点,所以应该是深度优先遍历,然后不断更新最大深度。(?)
掌握递归和普通循环的写法。
递归:
public class Solution { int max = 0; public int TreeDepth(TreeNode root) { if(root==null) return 0; getDepth(root,0); return max; } public void getDepth(TreeNode root, int now){ if(root==null){ if(now>max) max = now; return; // 一开始把return忘了 } now++; getDepth(root.left,now); getDepth(root.right,now); }}
换一种递归写法:
public class Solution { public int TreeDepth(TreeNode root) { if(root==null) return 0; return getDepth(root,0,0); } public int getDepth(TreeNode root, int now, int max){ if(root==null){ if(now>max) max = now; return max; } now++; max = getDepth(root.left,now,max); max = getDepth(root.right,now,max); return max; }}
别人的递归
思路:该树的深度等于其左右子树的最大深度+1。
public class Solution { public int TreeDepth(TreeNode pRoot) { if(pRoot == null){ return 0; } int left = TreeDepth(pRoot.left); int right = TreeDepth(pRoot.right); return Math.max(left, right) + 1; }}
非递归
import java.util.Queue;import java.util.LinkedList;public class Solution { public int TreeDepth(TreeNode pRoot) { if(pRoot == null){ return 0; } Queue<TreeNode> queue = new LinkedList<TreeNode>(); queue.add(pRoot); int depth = 0, count = 0, nextCount = 1; while(queue.size()!=0){ TreeNode top = queue.poll(); count++; if(top.left != null){ queue.add(top.left); } if(top.right != null){ queue.add(top.right); } if(count == nextCount){ nextCount = queue.size(); count = 0; depth++; } } return depth; }}
depth:当前节点所在的层数,count已经遍历了的节点数,nextCount下层的节点总数;当count==nextCount的时候,代表本层的节点已经遍历完毕。
或者只维护一个count值,表示上一层的节点数,然后在while循环里用一个for循环遍历完,更直观一点
阅读全文
0 0
- 剑指offer——二叉树的深度(虽然都是递归,但递归也有不同的写法,or循环)
- 二叉树的深度(剑指offer)递归
- 剑指offer:二叉树的深度(递归&&非递归)(java)
- 剑指offer之求二叉树的深度(非递归的层次遍历)Java实现
- 《剑指offer》求二叉树的最小深度(非递归法)
- 二叉树的最小深度(递归)
- 二叉树的深度(递归+非递归)
- 二叉树的深度(递归+非递归)
- 二叉树的深度(递归和非递归)
- 剑指offer--对称的二叉树(递归)
- 【剑指offer】二叉树的镜像(递归+非递归)
- 剑指offer面试题:求二叉树的镜像(递归、循环解法及测试用例)
- 剑指offer—二叉树的深度
- 剑指offer—二叉树的深度
- 剑指offer — 二叉树的深度
- 二叉树的深度优先遍历(递归、非递归),广度优先遍历(递归)
- 【剑指offer】重建二叉树&&二叉树的递归与非递归遍历
- C++实现——二叉树的四种遍历(非递归写法)
- List,Map和Set的区别
- [杂题] AtCoder Grand Contest 007 E Shik and Travel
- [week 9][Leetcode][Dynamic Programming] Best Time to Buy and Sell Stock
- 处理死锁和预防死锁的方法
- java设计模式——代理模式
- 剑指offer——二叉树的深度(虽然都是递归,但递归也有不同的写法,or循环)
- supervisor 管理进程
- 51nod 1875 丢手绢
- 消息中间件(JMS)学习教程
- Centos6.8环境下用yum命令搭建lnmp环境
- first blog
- 核对表:自说明代码
- java主线程结束和子线程结束之间的关系
- http://blog.csdn.net/vaintwyt/article/details/42043269