二叉树的层次遍历和最大宽度

1、二叉树的层次遍历。

  二叉树的层序遍历的实现还是比较简单的,由于其层级的关系,很明显要用到队列来辅助实现,主要是从左向右,自上而下,依次将二叉树的各节点入队,这样便可以保证输出的顺序是层序排列的。下面是算法的实现思想:

    先将树的根节点入队,

    如果队列不空,则进入循环

    {

      将队首元素出队,并输出它;

      如果该队首元素有左孩子,则将其左孩子入队;

      如果该队首元素有右孩子,则将其右孩子入队

    }



/**
 * 二叉树的层次遍历。
 */ 


function breathNode($node){
$queue=array();
array_unshift($queue,$node);
while(!empty($queue)){
$root=array_pop($queue);
echo $root->data.' ';
if($root->left!=null){
array_unshift($queue,$root->left);
}
if($root->right!=null){
array_unshift($queue,$root->right);
}
}
}



2 二叉树的宽度

题目: 
给定一颗二叉树,求二叉树的宽度。

宽度的定义: 
二叉树的宽度定义为具有最多结点数的层中包含的结点数。

这里写图片描述

比如上图中,第1层有1个节点, 第2层有2个节点, 第3层有4个节点, 第4层有1个节点,可知,第3层的结点数最多,所以这棵二叉树的宽度就是4。

求解思路: 

这里需要用到二叉树的层次遍历,即广度优先周游。在层次遍历的过程中,通过读取队列中保留的上一层的节点数来记录每层的节点数,以获取所有层中最大的节点数。关于二叉树的广度优先周游,参考

/*
 * 获取二叉树的最大宽度。
 */
function getBreathNodeWidt($node){
$queue=array();
array_unshift($queue,$node);
$lastWidth=1;//用于记录上一层的宽度。
$curWidth=1; //用于记录当前层的宽度。
$maxWidth=0;//用户记录二叉树的最大宽度。
if($node==null){
$bigWidth=0;
}
if($node->left==null && $node->right==null){
$bigWidth=1;
}
while(!empty($queue)){
while($lastWidth!=0){
$root=array_pop($queue);
echo $root->data.' ';
if($root->left!=null){
array_unshift($queue,$root->left);
}
if($root->right!=null){
array_unshift($queue,$root->right);
}
$lastWidth--;
}
$curWidth=sizeof($queue);
$maxWidth=$curWidth>$maxWidth?$curWidth:$maxWidth;
$lastWidth=$curWidth;
}
return $maxWidth;
}





猜你喜欢

转载自blog.csdn.net/zlb_lover/article/details/80860631