剑指Offer55 I.二叉树的深度
分别用后序遍历以及层序遍历实现(Python3+Java)
上代码(后序遍历)
Python:
class Solution:
def maxDepth(self, root: TreeNode) -> int:
# 方法1:后序遍历实现
# 当节点为空时返回0,包括任意节点为空时均返回0
if root is None:
return 0
# 递归,返回左右节点中深度大的节点的深度值,递归每返回一层深度值+1
return max(self.maxDepth(root.left),self.maxDepth(root.right)) + 1
Java:
class Solution {
public int maxDepth(TreeNode root) {
// 方法1:后序遍历实现
// 和python几乎没什么区别,只是语法不同
if (root == null){
return 0;
}
return Math.max(maxDepth(root.left),maxDepth(root.right)) + 1;
}
}
层序遍历:
Python:
class Solution:
def maxDepth(self, root: TreeNode) -> int:
# 方法2:层序遍历实现
if root is None:
return 0
# 初始化一个队列
que = [root]
# num表示树的深度
num = 0
# 只要队列不为空,就一直循环
while que:
# 初始化一个临时队列
tmp = []
# 遍历队列中的每一个树节点
for node in que:
# 当前节点的左节点和右节点不为空就加入到临时队列中
if node.left:
tmp.append(node.left)
if node.right:
tmp.append(node.right)
# 遍历队列结束,用临时队列替换原有队列
que = tmp
# 深度+1
num += 1
# 返回深度值
return num
Java:
class Solution {
public int maxDepth(TreeNode root) {
// 方法2:层序遍历
// 和python几乎没什么区别,只是语法不同
if (root == null){
return 0;
}
List<TreeNode> que = new LinkedList<TreeNode>();
que.add(root);
int num = 0;
while (!que.isEmpty()){
List<TreeNode> tmp = new LinkedList<TreeNode>();
for (TreeNode node : que){
if (node.left != null){
tmp.add(node.left);
}
if (node.right != null){
tmp.add(node.right);
}
}
que = tmp;
num ++;
}
return num;
}
}
总结:
1)后序遍历实现方式代码较少,但是递归可能不太好理解;
2)层序遍历比较好理解,但是代码量较多;
3)两种方法复杂度是一样的,但是应该后序遍历在时间上要略优一点,仅供参考;
4)如果有任何错误,欢迎各位大佬指正!