森林链式储存方式求高度(递归,层次)
1. 头文件
#include<iostream>
#include<queue>
2.节点
struct node {
char data;
node *lkid;
node *rbro;
};
在结点中我们要设立这个节点的 data 值,他的第一个左孩子,他的兄弟
3.构造二叉树
森林的一种变形也就是一种特殊的二叉树,用孩子—兄弟方式来创造
我们采用递归的方式来构造二叉树
void createtree(node*&t)
{
char ch;
cin>>ch;
if(ch=='#')
t=NULL;
else
{
t=new node;
t->data=ch;
createtree(t->lkid);
createtree(t->rbro);
}
}
4.遍历求高度
int high(node *t)
{
if(t==NULL) return 0;
else
{
int a, b;
a = high(t->lkid)+1;
b = high(t->rbro);
return max(a, b); //依次比较右子树所有结点高度 取最高的即可
}
}
在森林转为二叉树的逻辑中,新的二叉树中,只要结点有左孩子,就要给他的层次 +1
但右兄弟就不用,不过还是要遍历右兄弟,因为右兄弟的后继结点中可能也有左孩子
5.层次遍历求深度
int dep(node * root)
{
queue<node*> Queue;
Queue.push(root);
int height = 0; //层次遍历高度
while (Queue.size() != 0) //入队的是每个根节点的左孩子,在森林中就是他的下一级
{
int len = Queue.size(); //左孩子的个数决定他的循环次数 因为每找到一个左孩子 就要看看这个左孩子还有没有左孩子
node* n;
for (int i = 1; i <= len; i++)
{
n = Queue.front(); //提取根节点 n用来遍历结点
Queue.pop();
while (n != NULL)
{
if (n->lkid != NULL) Queue.push(n->lkid); //有左孩子就入队
n = n->rbro;
}
}
height++;
}
return height;
}
层次遍历要用到队列,队列里面储存的是有左孩子的结点,只要遍历时发现有这样的节点,就入队。
之后再遍历他的右兄弟。
一次循环后层次 +1
6.主函数
int main()
{
node *t;
createtree(t);
cout<<"森林链式递归遍历求高度"<<endl;
cout<<high(t)<<endl;
cout<<"森林链式层次遍历求高度"<<endl;
cout<<dep(t);
}
7.输出结果
ABEK##F##CG##DH#I#J###L#MN###