求树的最大宽度(层次遍历法)

本文介绍了一种通过队列实现的层次遍历来计算二叉树最大宽度的方法。使用一个变量记录每层节点数量,在遍历过程中不断更新最大宽度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树宽度:使用队列,层次遍历二叉树。在上一层遍历完成后,下一层的所有节点已经放到队列中,此时队列中的元素个数就是下一层的宽度。以此类推,依次遍历下一层即可求出二叉树的最大宽度。
怎么一层一层地分开呢?用一个变量len来记录当前层的结点数,出一个结点就len–,len==0的时候就退出循环,然后又把队列中的节点数赋值给len

 int getWidth(BiNode head) {    
     if(head==null)    
         return 0;    
     int max=1;    
     LinkedList<BiNode>ll=new LinkedList<BiNode>();    
        ll.add(head);    
        while(true){    
            int len=ll.size();   //获取当前层的节点数 
            if(len==0)  //队列空,二叉树已经遍历完  
                break;    
            while(len>0){    
                BiNode b=ll.poll();    
                len--;    出一个结点-1,为0就退循环
                if(b.left!=null)    
                    ll.add(b.left);    
                if(b.right!=null)    
                    ll.add(b.right);    
            }    
            max=Math.max(max, ll.size());              
        }    
        return max;    
    }  
### 层次遍历算法概述 层次遍历是一种按层访问二叉树节点的方法,即从根节点开始逐层向下访问每一层中的所有节点。这种遍历方式不同于传统的先序、中序和后序遍历,它不依赖于递归机制而是借助队列这一辅助数据结构来实现[^1]。 #### 队列的作用 由于层次遍历是从上至下、由左向右依次处理各结点,在每次处理当前结点的同时还需要记录其子结点以便后续继续沿该方向深入探索其他更深层级上的元素;而队列具有先进先出(FIFO)特性正好满足上述需,因此被广泛应用于此类场景之中[^3]。 #### C语言实现示例 下面提供了一个基于C语言编写的简单版本的二叉树层次遍历函数: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树节点结构体 typedef struct TreeNode { int val; struct TreeNode *left, *right; } BiTreeNode; // 创建新节点 BiTreeNode* createNode(int value){ BiTreeNode* newNode=(BiTreeNode*)malloc(sizeof(BiTreeNode)); newNode->val=value; newNode->left=NULL; newNode->right=NULL; return newNode; } void levelOrderTraversal(BiTreeNode *root){ if (!root) return ; // 初始化队列并加入根节点 queue<BiTreeNode*> q; q.push(root); while(!q.empty()){ BiTreeNode *current=q.front(); printf("%d ", current->val); // 将左右孩子入队 if(current->left!=NULL) q.push(current->left); if(current->right!=NULL) q.push(current->right); // 访问完毕弹出此节点 q.pop(); } } ``` 需要注意的是以上代码片段包含了部分简化假设条件(例如未考虑内存释放等问题),实际应用时应当根据具体情况进行适当调整优化。 #### Python实现示例 除了C语言之外,Python也可以很方便地完成同样的功能,并且语法更加简洁直观: ```python from collections import deque class Node: def __init__(self,value=None,left=None,right=None): self.value = value self.left = left self.right = right def level_order_traversal(node): result = [] if not node: return result queue = deque([node]) while queue: curr_node = queue.popleft() result.append(curr_node.value) if curr_node.left is not None: queue.append(curr_node.left) if curr_node.right is not None: queue.append(curr_node.right) return result ``` 这段程序同样实现了利用队列来进行广度优先搜索的过程,通过`deque()`双端队列代替了标准列表作为存储待访问顶点的数据容器,从而提高了性能表现[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值