二叉树进阶操作
- 统计度数为1的节点的个数
- 叶子节点到根节点的路径
- 交换左右节点
- 广度优先遍历
广度优先遍历
所谓广度,即是按照树的横向来遍历,遵循按顺序输出,所以引入队列,进行先入先出。(直接用STL容器了,自己写队列操作,不可能,绝对不可能🐶)
测试实例:
int Count_Grade_1(Bitree T) //统计度数为1的节点个数
{
if (T == NULL) return 0;
else if ((!T->leftchild) && (T->rightchild) || (T->leftchild) && (!T->rightchild)) //只有左节点或只有右节点
return Count_Grade_1(T->leftchild) + Count_Grade_1(T->rightchild) + 1;
else return Count_Grade_1(T->leftchild) + Count_Grade_1(T->rightchild);
}
void Leaf_Path_Root(Bitree T, char path[], int pathlen) //叶子节点到根节点的路径
{
int i;
if (T != NULL)
{
path[pathlen] = T->val;
if (!T->leftchild && !T->rightchild) //叶子节点
{
for (i = pathlen; i >= 0; i--)
cout << path[i] << ' ';
cout << endl;
}
else
{
Leaf_Path_Root(T->leftchild, path, pathlen + 1);
Leaf_Path_Root(T->rightchild, path, pathlen + 1);
}
}
}
void Exchage_Node(Bitree T) //左右节点交换
{
Bitree Temp;
if (T != NULL)
{
Temp = T->leftchild;
T->leftchild = T->rightchild;
T->rightchild = Temp;
Exchage_Node(T->leftchild);
Exchage_Node(T->rightchild);
}
}
void BFS(Bitree T) //广度优先遍历
{
queue <BiNode*> nodequeue;
nodequeue.push(T);
BiNode* node;
while (!nodequeue.empty())
{
node = nodequeue.front();
nodequeue.pop();
cout << node->val << ' ';
if (node->rightchild)
nodequeue.push(node->rightchild);
if (node->leftchild)
nodequeue.push(node->leftchild);
}
}
int main()
{
Bitree T;
char path[100];
int pathlen = 0;
cout << "先序遍历创建树,请输入(以‘#’结束): " << endl;
Create_Bitree(T); //创建二叉树
cout << "度数为1的节点个数:" << Count_Grade_1(T) << endl;
cout << "叶子节点到根节点的路径:" << endl;
Leaf_Path_Root(T,path,pathlen);
Exchage_Node(T);
cout << "交换节点后先序遍历结果:" << endl;
PreOrderTraverse(T); //先序遍历二叉树
cout << endl;
cout << "广度优先遍历:" << endl;
BFS(T);
}
测试结果: