首页 > 编程知识 正文

构造二叉树代码,二叉树的最大深度

时间:2023-05-05 19:33:38 阅读:166789 作者:3820

题目是输入一根二叉树的根节点,求出该树的深度。 从根节点到叶节点依次通过的节点(包括根、叶节点)形成树的路径,最长路径的长度为树的深度。

主题示例:

给出二叉树[ 3,9,20,null,null,15,7 ]

3/ 9 20/ 15 7返回其最大深度3

解决问题的想法可以利用深度优先搜索(DFS )、广度优先搜索(BFS )

3358www.Sina.com/正向扫描(根左右)、中正向扫描(左根右)、后向扫描(左根右) )常见的 DFS(Deep First Search) 正向扫描(即逐层扫描)二叉树结构typetreeeeenodeststttttom

最大深度(root.left )、最大深度(root.right ) ) 1复杂度分析:

时间复杂度o(n ) n是树的节点数,计算树的深度需要遍历所有节点。 空间复杂度o(n )最坏的情况(树退化为链表的情况)递归深度可以达到n。 //dfsfuncmaxdepth (root * treenode ) int ) root为nil时,直接返回0ifroot==nil(return0) /,分别统计左节点深度、右节点深度,最大值为/获取最大值func max(a ) a,b int ) int ) ifab ) returna ) returnb )的第二实现-广度优先搜索BFS解题思路:

遍历一楼后,计数器1 1可以获得树的深度,直到遍历完成。 复杂度分析:

时间复杂度o(n )空间复杂度o(n )/BFSfuncmaxdepthV2) root*treenode ) int ) /如果根节点为0,则直接返回0ifroot==nil(return0)//队列vavarturn root ) /声明深度变量var depth int//) /判断队列不是nilforlen!=0 {var tmp []*TreeNodefor _,v:=rangestack(/如果有左子树,左子树进入if v.Left!=nil{tmp=append(tmp,v.Left ) ) /右边的子树入队到if v.Right (如果有)!=nil{tmp=append(tmp, v.Right ) }//将下一个层次的数量分配给堆栈,遍历下一个层次的循环stack=tmp//每个层次,然后深度1depth }return depth} Golang解题代码typetreenodestruct treenode}functestmaxdepth(t* testing.testing ) treenode ) functestmaxdepth { head :=new (treenode ) head.val=3left:=new ) treeenode } left d.left=left right 360 left 01.val=15 right.left=left 01 right 023360=new (treenode ) right 02.val=7right.right=reft n ) ) fmt.printf ) depth:%v ),maxdepthV2 ) head ) ) fmt.printf ) (n ) )。 直接返回0if root==nil {return 0}//分别统计左节点深度、右节点深度,取最大值最后计算1returnmax(maxdepth(root.left )、maxdepth ) root . 要添加的bint(int(ifab ) returna ) returnb )/BFSfuncmaxdepthV2) root*treenode ) int ) /如果根节点为0,则直接添加0ifroot==nil ) retretep 确定根节点不是排队的堆栈=append (stack,root ) /声明深度变量var depth int//队列为nilforlen!=0 {var tmp []*TreeNodefor _,v:=rangestack(/如果有左子树,左子树进入if v.Left!=nil{tmp=append(tmp,v.Left ) ) /右边的子树入队到if v.Right (如果有)!=nil{tmp=append(tmp,v.Right ) }//将下一层的数量指定给stack,然后遍历用于下一层循环的stack=tmp//各层,最后返回深度为1 depth

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。