今天继续填坑!
建树的代码可以参考之前文章:
有一说一,二叉树这个坑是真的大,填坑快要累死人了。
废话不多说,今天看二叉树常用的几个操作。
同之前,使用的二叉树如下:
这棵树也是我们的老演员了,建树操作参考之前文章,这里不再累述。
一、层序遍历
层序遍历是指,按照层级打印二叉树。如上树,层序遍历结果应该为:
a -> b -> g -> c -> d -> h -> e -> f
为了达到这个目标,我们需要保证我们的节点有顺序的从左到右进行打印,而这个顺序,刚好符合一种数据结构的特性:“先进先出”,即队列。
实现思路:借助队列,保存每个节点的左孩子和右孩子,然后从头开始遍历即可。
代码:
void FloorOrder(std::list<Node *> &floor_node_list)
{
if(floor_node_list.empty())
return ;
Node *pTree = floor_node_list.front();
if(!pTree)
return ;
floor_node_list.pop_front();
cout<< pTree->data << " -> ";
if(pTree->left)
floor_node_list.push_back(pTree->left);
if(pTree->right)
floor_node_list.push_back(pTree->right);
FloorOrder(floor_node_list);
}
void FloorOrder(Node *pTree)
{
std::list<Node *> floor_node_list;
floor_node_list.push_back(pTree);
FloorOrder(floor_node_list);
}
运行结果:
二、求树的高度
树的高度是指,从根节点到最深的叶子节点,所经过的节点个数。
实现方式:每个根节点的深度,都是 1 + MAX(左子树深度,右子树深度)。这个思路,就非常适合用递归,因为递归的代码很简单并且方便阅读。
我们的演员树,他的深度应该是4。
代码:
// 获取树深度
int GetTreeDepth(Node *pTree)
{
if(!pTree)
return 0;
int iDepthLeft = 0;
if(pTree->left)
iDepthLeft = 1 + GetTreeDepth(pTree->left);
int iDepthRight = 0;
if(pTree->right)
iDepthRight = 1 + GetTreeDepth(pTree->right);
if(0 == iDepthLeft && 0 == iDepthRight)
return 1;
else
return iDepthLeft >= iDepthRight ? iDepthLeft : iDepthRight;
}
运行结果:
三、求树的节点个数
节点个数是指,树的所有节点数。
实现思路也比较清楚了。借助上一道题目,我们可以把节点个数抽象为:节点个数 = 1 + 左子树节点数 + 右子树节点数。
同理,这个思路,也是递归无敌呀。
代码:
// 获取节点个数
int GetTreeNodeCount(Node *pTree)
{
if(!pTree)
return 0;
int iNodeCountLeft = 0;
if(pTree->left)
iNodeCountLeft = GetTreeNodeCount(pTree->left);
int iNodeCountRight = 0;
if(pTree->right)
iNodeCountRight = GetTreeNodeCount(pTree->right);
return 1 + iNodeCountLeft + iNodeCountRight;
}
运行截图:
四、求叶子节点个数
针对所有节点个数,做一层判断即可。
代码:
// 计算叶子节点个数
int GetTreeLeafNodeCount(Node *pTree)
{
if(!pTree)
return 0;
if(!pTree->left && !pTree->right)
return 1;
int iNodeCountLeft = GetTreeLeafNodeCount(pTree->left);
int iNodeCountRight = GetTreeLeafNodeCount(pTree->right);
return iNodeCountLeft + iNodeCountRight;
}
运行截图:
话说自从应粉丝要求,开始更新二叉树系列文章之后,阅读量少的可怜。不过开弓没有回头箭,二叉树系列文章我也将尽快结尾,预计再有一篇“二叉树操作”文章和一篇“二叉树感念进阶”文章,二叉树也将告一段落。
如有其他希望了解的点,可以给我留言~
最后,点赞再看支持一下~
也可以关注我的公众号【头发头发等等我】