美文网首页
leetcode-662.二叉树最大宽度(OC)

leetcode-662.二叉树最大宽度(OC)

作者: money_ac9e | 来源:发表于2022-02-07 16:52 被阅读0次

二叉树最大宽度

地址:https://leetcode-cn.com/problems/maximum-width-of-binary-tree/

给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。

 每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。

 示例 1:

 输入:

            1
          /   \
         3     2
        / \     \
       5   3     9

 输出: 4
 解释: 最大值出现在树的第 3 层,宽度为 4 (5,3,null,9)。

 
 示例 2:

 输入:

           1
          /
         3
        / \
       5   3

 输出: 2
 解释: 最大值出现在树的第 3 层,宽度为 2 (5,3)。
 
 
 示例 3:

 输入:

           1
          / \
         3   2
        /
       5

 输出: 2
 解释: 最大值出现在树的第 2 层,宽度为 2 (3,2)。
 示例 4:

 输入:

           1
          / \
         3   2
        /     \
       5       9
      /         \
     6           7
 输出: 8
 解释: 最大值出现在树的第 4 层,宽度为 8 (6,null,null,null,null,null,null,7)。
 注意: 答案在32位有符号整数的表示范围内。

使用OC 我们需要创建一个BinaryTreeNode节点model 里面的对象如下

/**
 *  值
 */
@property (nonatomic, assign) NSInteger value;
/**
 *  左节点
 */
@property (nonatomic, strong) BinaryTreeNode *leftNode;
/**
 *  右节点
 */
@property (nonatomic, strong) BinaryTreeNode *rightNode;

层次遍历

这里首先是层次遍历,将每层区分出来
每层记录每层最开始节点的下标 left
每层其他的节点都剪去最开始的 就为每个节点的宽度
选出最大的宽度 即为结果

- (NSInteger)widthOfBinaryTree:(BinaryTreeNode *)root
{
    if (root == nil) {
        return 0;
    }

    NSMutableArray *dataArray = [NSMutableArray array];
    
    [dataArray addObject:root];
    
    ///用于判断某层
    NSInteger count = dataArray.count;
    NSInteger levelMax = dataArray.count;
    BOOL isNewLevel = NO;
    BOOL isNewNode = NO;
    
    ///每层最左侧的位置
    NSInteger left = 0;
    
    ///最大宽度
    NSInteger max = 0;
    
    while (dataArray.count > 0) {
       
        BinaryTreeNode *node = [dataArray firstObject];
        [dataArray removeObjectAtIndex:0];
        count--;
        
        ///这里将左右都放入队列中,不需要判断左右是否为空
        if ([node isKindOfClass:[BinaryTreeNode class]] && node.leftNode) {
            [dataArray addObject:node.leftNode];
            isNewNode = YES;
        } else {
            [dataArray addObject:@"NULL"];
        }
        
        if ([node isKindOfClass:[BinaryTreeNode class]] && node.rightNode) {
            [dataArray addObject:node.rightNode];
            isNewNode = YES;
        } else {
            [dataArray addObject:@"NULL"];
        }
        
        /// 同一层 且左侧没有值  left赋值
        if (isNewLevel == NO && left == 0 && [node isKindOfClass:[BinaryTreeNode class]]) {
            left = levelMax - count;
        }else {
            isNewLevel = YES;
        }
        
        if ([node isKindOfClass:[BinaryTreeNode class]]) {
            NSInteger nodeMax = levelMax - count - left + 1;
            max = MAX(max, nodeMax);
        }
        
        if (count == 0) {
            
            if (isNewNode == NO) {
                [dataArray removeAllObjects];
            }
            
            count = dataArray.count;
            levelMax = dataArray.count;
            left = 0;
            isNewLevel = NO;
            isNewNode = NO;
        }
    }
    
    return max;
}

验证

{
        /*
         1
       /   \
      3     2
     / \     \
    5   3     9
         */
        
        BinaryTreeNode *node1 = [[BinaryTreeNode alloc] init];
        node1.value = 1;
        
        BinaryTreeNode *node2 = [[BinaryTreeNode alloc] init];
        node2.value = 3;
        
        BinaryTreeNode *node3 = [[BinaryTreeNode alloc] init];
        node3.value = 2;
        
        node1.leftNode = node2;
        node1.rightNode = node3;
        
        BinaryTreeNode *node4 = [[BinaryTreeNode alloc] init];
        node4.value = 5;
        
        BinaryTreeNode *node5 = [[BinaryTreeNode alloc] init];
        node5.value = 3;
        
        node2.leftNode = node4;
        node2.rightNode = node5;
        
        BinaryTreeNode *node6 = [[BinaryTreeNode alloc] init];
        node6.value = 9;
        
        node3.rightNode = node6;
        
        NSInteger aa = [self widthOfBinaryTree:node1];
        NSLog(@"aa is %ld",aa);
    }
    
    {
        /*
         1
        /
       3
      / \
     5   3
         */
        
        BinaryTreeNode *node1 = [[BinaryTreeNode alloc] init];
        node1.value = 1;
        
        BinaryTreeNode *node2 = [[BinaryTreeNode alloc] init];
        node2.value = 3;
        
        node1.leftNode = node2;
        
        BinaryTreeNode *node3 = [[BinaryTreeNode alloc] init];
        node3.value = 5;
        
        BinaryTreeNode *node4 = [[BinaryTreeNode alloc] init];
        node4.value = 3;
        
        node2.leftNode = node3;
        node2.rightNode = node4;
    
        NSInteger aa = [self widthOfBinaryTree:node1];
        NSLog(@"aa is %ld",aa);
    }
    
    {
        /*
         1
        / \
       3   2
      /
     5
         */
        
        BinaryTreeNode *node1 = [[BinaryTreeNode alloc] init];
        node1.value = 1;
        
        BinaryTreeNode *node2 = [[BinaryTreeNode alloc] init];
        node2.value = 3;
        
        BinaryTreeNode *node3 = [[BinaryTreeNode alloc] init];
        node3.value = 2;
        
        node1.leftNode = node2;
        node1.rightNode = node3;

        BinaryTreeNode *node4 = [[BinaryTreeNode alloc] init];
        node4.value = 5;
        
        node2.leftNode = node4;
    
        NSInteger aa = [self widthOfBinaryTree:node1];
        NSLog(@"aa is %ld",aa);
    }
    
    {
        /*
         1
        / \
       3   2
      /     \
     5       9
    /         \
   6           7
         */
        
        BinaryTreeNode *node1 = [[BinaryTreeNode alloc] init];
        node1.value = 1;
        
        BinaryTreeNode *node2 = [[BinaryTreeNode alloc] init];
        node2.value = 3;
        
        BinaryTreeNode *node3 = [[BinaryTreeNode alloc] init];
        node3.value = 2;
        
        node1.leftNode = node2;
        node1.rightNode = node3;
        
        BinaryTreeNode *node4 = [[BinaryTreeNode alloc] init];
        node4.value = 5;
        
        node2.leftNode = node4;

        BinaryTreeNode *node5 = [[BinaryTreeNode alloc] init];
        node5.value = 9;
        
        node3.rightNode = node5;

        BinaryTreeNode *node6 = [[BinaryTreeNode alloc] init];
        node6.value = 6;
        
        node4.leftNode = node6;

        BinaryTreeNode *node7 = [[BinaryTreeNode alloc] init];
        node7.value = 7;
        
        node5.rightNode = node7;
        
        NSInteger aa = [self widthOfBinaryTree:node1];
        NSLog(@"aa is %ld",aa);
    }

相关文章

  • leetcode-662.二叉树最大宽度(OC)

    二叉树最大宽度 地址:https://leetcode-cn.com/problems/maximum-width...

  • leetcode-662.二叉树最大宽度

    题目: 给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(f...

  • 662. 二叉树最大宽度[leetcode]

    给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full ...

  • 662. Maximum Width of Binary Tre

    给定二叉树,求二叉树的最大宽度。二叉树某层的宽度是指其最左非空节点与最右非空节点之间的跨度。 解题思路:二叉树层次...

  • 手撕LeetCode #662——Python

    662. 二叉树最大宽度[https://leetcode-cn.com/problems/maximum-wid...

  • 二叉树的宽度

    一、二叉树的宽度 二叉树的宽度是指含有最多节点数的对应层对应的节点数,我们之前提到了二叉树的层次遍历,二叉树的宽度...

  • 二叉树的宽度优先搜索(层次遍历,BFS)

    二叉树结构: 二叉树宽度优先搜索: 按照二叉树的层数依次从左到右访问二叉树的节点;例如:给定一个二叉树: 按照宽度...

  • 求树的最大宽度

    所谓二叉树的宽度是指:二叉树各层节点个数的最大值。我们知道层序遍历二叉树是使用deque来实现的:每次打印一个节点...

  • uitableview cell 不同屏幕下cell宽度不变解决

    swift 在awakeFromNib 中设置cell frame宽度为当前屏幕宽度 ,oc 重写init frame

  • 关于二叉树的算法题

    前序遍历中序遍历后序遍历判断是否是平衡二叉树判断是否是对称二叉树判断二叉树高度按照层遍历二叉树判断二叉树宽度

网友评论

      本文标题:leetcode-662.二叉树最大宽度(OC)

      本文链接:https://www.haomeiwen.com/subject/ykbmkrtx.html