首页 > 试题广场 >

二叉树的最大宽度

[编程题]二叉树的最大宽度
  • 热度指数:2343 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个二叉树,请你求出此二叉树的最大宽度。

本题中树第 i 层的宽度定义为:第 i 层最左边的节点到最右边之间的距离,中间空节点也计入距离。

例如:

本树中第 1 层只有一个节点,故第 1 层宽度是 1 ,第二层最左侧到最右侧的距离是 2 ,所以宽度是 2 , 第三层最左侧 4 到最右侧 5 距离是 4 ,故宽度是 4,此树最大宽度是 4。
示例1

输入

{1,2,3,4,#,4,5}

输出

4

说明

如题面图   
示例2

输入

{1}

输出

1
示例3

输入

{1,2,3,4,#,4,5,6,#,1}

输出

5

说明

倒数第二层的宽度为5 

说明:本题目包含复杂数据结构TreeNode,点此查看相关信息
package main
import _"fmt"
import . "nc_tools"
/*
 * type TreeNode struct {
 *   Val int
 *   Left *TreeNode
 *   Right *TreeNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param root TreeNode类 
 * @return int整型
*/
func widthOfBinaryTree( root *TreeNode ) int {
    if root==nil{
        return 0
    }
    root=label(root,1)
    max:=1
    q:=[]*TreeNode{root}
    for len(q)>0{
        new_q:=[]*TreeNode{}
        for _,qi:=range q{
            if qi.Left!=nil{
                new_q=append(new_q,qi.Left)
            }
            if qi.Right!=nil{
                new_q=append(new_q,qi.Right)
            }
        }
        x:=1
        if len(new_q)>1{
            x=new_q[len(new_q)-1].Val-new_q[0].Val+1
        }
        if x>max{
            max=x
        }
        q=new_q
    }
    return max
}

func label(root *TreeNode,x int)*TreeNode{
    if root==nil{
        return nil
    }
    root.Val=x
    root.Left=label(root.Left,x*2)
    root.Right=label(root.Right,x*2+1)
    return root
}


发表于 2023-03-09 21:14:20 回复(0)

问题信息

难度:
1条回答 2603浏览

热门推荐

通过挑战的用户

查看代码