输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为 1 。
数据范围:节点的数量满足
,节点上的值满足 
进阶:空间复杂度
,时间复杂度 )
假如输入的用例为{1,2,3,4,5,#,6,#,#,7},那么如下图:
# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def TreeDepth(self, pRoot): # write code here if not pRoot: return 0 if not pRoot.left and not pRoot.right: return 1 left=self.TreeDepth(pRoot.left) right=self.TreeDepth(pRoot.right) return max(left,right)+1
python解法:
解法1:前序递归遍历;
class Solution: def TreeDepth(self, pRoot): if pRoot is None: return 0 left = self.TreeDepth(pRoot.left) right = self.TreeDepth(pRoot.right) return max(left, right) + 1
解法2:非递归:层次遍历;
class Solution: def TreeDepth(self, pRoot): if pRoot is None: return 0 depth = 0 q = [] # 设置队列q存储节点; q.append(pRoot) # 根结点入队; while q: for i in range(len(q)): # 遍历同一层节点; p = q.pop(0) # 队头元素出队; if p.left is not None: # 左子树不空,左子树入队列; q.append(p.left) if p.right is not None: # 右子树不空,右子树入队列; q.append(p.right) depth += 1 # 深度+1 return depth
from collections import deque class Solution: def TreeDepth(self, pRoot): # write code her squeue = deque() squeue.append(pRoot) n = 0 if pRoot is None: return n while len(squeue): tmp = [] q = len(squeue) for i in range(q): node = squeue.popleft() if node.left is not None: squeue.append(node.left) if node.right is not None: squeue.append(node.right) tmp.append(node.val) if len(tmp) > 0: n+=1 return n利用二叉树的层次遍历,通过记录每层节点,来输出深度
# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def TreeDepth(self, pRoot): # write code here if not pRoot: return 0 LeftDepth = self.TreeDepth(pRoot.left) RightDepth = self.TreeDepth(pRoot.right) if LeftDepth > RightDepth: return LeftDepth + 1 return RightDepth + 1
# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def TreeDepth(self, pRoot): if pRoot == None: return 0 def recur(root,level): maxlevel = level if root.left!=None: maxlevel = max(maxlevel,recur(root.left,level+1)) if root.right!=None: maxlevel = max(maxlevel,recur(root.right,level+1)) return maxlevel return recur(pRoot,1)
# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def __init__(self): self.stack=[]#栈 self.depth=0 def DFS(self,root): if not root:return None self.stack.append(root) if not root.left and not root.right:#到达叶子结点 if self.depth<len(self.stack):self.depth=len(self.stack)#如果深度大于记录值,则更新。 else: self.DFS(root.left) self.DFS(root.right) del self.stack[-1]#将栈顶元素弹出,即回溯 def TreeDepth(self, pRoot): # write code here self.DFS(pRoot) return self.depth
# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def __init__(self): ll=[] def TreeDepth(self, pRoot): zhan=[] flag=[] p=pRoot if p==None: return 0 if p.left==None and p.right==None: return 1 return max(self.TreeDepth(p.left),self.TreeDepth(p.right))+1 # write code here
#-*- coding:utf-8 -*- class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None class Solution: def TreeDepth(self, pRoot): """ 节点的深度 = 左右子节点的深度的最大 + 1 :param pRoot: :return: """ if not pRoot: return 0 else: return 1 + max(self.TreeDepth(pRoot.left), self.TreeDepth(pRoot.right)) t = TreeNode(8) t.left = TreeNode(6) t.right = TreeNode(10) t.left.left = TreeNode(5) t.left.right = TreeNode(7) t.right.left = TreeNode(9) t.right.right = TreeNode(11) s = Solution() ans = s.TreeDepth(t) print(ans)
# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def TreeDepth(self, pRoot): # write code here high = 0 if not pRoot: return 0 stack = [] stack.append((pRoot,[pRoot.val])) while stack: node,path = stack.pop(0) if node.left == None and node.right == None: tmp = len(path) if tmp > high: high = tmp if node.left != None: stack.append((node.left,path + [node.left.val])) if node.right != None: stack.append((node.right,path + [node.right.val])) return high
class Solution: def TreeDepth(self, pRoot): # write code here #对于那些为空的节点 if pRoot==None: return 0 l1=0 l2=0 if pRoot!=None and pRoot.left==None and pRoot.right==None: #对于叶子节点,考虑这两个终止条件 return 1 if pRoot.left!=None: #左子树如果存在,就计算将根节点包含在内的左子树的高度 l1=1+self.TreeDepth(pRoot.left) if pRoot.right!=None: #右子树如果存在,就计算将根节点包含在内的右子树的高度 l2=1+self.TreeDepth(pRoot.right) #然后将左右子树的最大值赋值给根节点,通过递归的方式来得到树的最大深度 length1=l1 if l1>l2 else l2 return length1本题通过递归的方法,分别计算出左子树和右子树的高度,然后将其中的最大值加1作为根节点的高度。需要注意的是递归结束的条件是为空和非空但是左右子树都不存在
# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def TreeDepth(self, pRoot): # write code here if pRoot == None: return 0 else: return max(self.TreeDepth(pRoot.left), self.TreeDepth(pRoot.right)) + 1
# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def TreeDepth(self, pRoot): # write code here # 层次遍历法 rootlist=[pRoot] depth=0 while rootlist: temp=[] for i in rootlist: if i: #要加入这一步,保证非None,因为None没有left与right temp.append(i.left) temp.append(i.right) rootlist=temp depth=depth+1 return depth-1 #因为最终的rootlist是包括None节点的,所以需要把这一层的深度减去
# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def TreeDepth(self, pRoot): if not pRoot: return 0 return max(self.TreeDepth(pRoot.left),self.TreeDepth(pRoot.right))+1
# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def TreeDepth(self, pRoot): # write code here if not pRoot: return 0 else: left=self.TreeDepth(pRoot.left) right=self.TreeDepth(pRoot.right) return 1+max(left,right)