层序遍历:
除根结点外,每一层结点的父结点正好是上一层的所有结点。所以需要借助队列结构,存放结点地址。
先将根结点入队,然后进入循环:获取队头结点,判断其是否有子结点,有则入队,然后输出当前结点的值(或其他遍历方式),最后将该结点出队,重复这个过程,直到队列为空。
void LevelOrderTravers(BiTree *&T)
{
queue<BiTree*>q;
if(T!=nullptr) q.push(T);
BiTree *p=nullptr;//用于获取队头结点的指针
while(!q.empty())
{
p=q.front();
//如果当前队头的结点左右子树不为空,则入队
if(p->lchild!=nullptr)
q.push(p->lchild);
if(p->rchild!=nullptr)
q.push(p->rchild);
cout << p->data << endl;
q.pop();
}
}
层序建立:
逻辑的遍历类似,也需要借助队列结构。
这里用#代表无效字符,即空结点。
先获取第一个输入的字符,若为#,指针值设为nullptr;
否则根结点申请空间,并将其地址入队,然后进入循环:
获取队头结点,获取输入的字符,若不为#就保存到当前结点的左子树,并将左子树入队;若为#就将指针值设为nullptr。右子树同理。最后将当前结点出队。重复这个过程,直到队列为空。
void LevelOrderCreat(BiTree *&T)
{
queue<BiTree*>q;
char ch;
cin >> ch;
if(ch!='#')
{
T=new BiTree;
T->data=ch;
q.push(T);
}
BiTree *p=NULL;
while(!q.empty())
{
p=q.front();
q.pop();
cin >> ch;
if(ch!='#')
{
p->lchild=new BiTree;
p->lchild->data=ch;
q.push(p->lchild);
}
cin >> ch;
if(ch!='#')
{
p->rchild=new BiTree;
p->rchild->data=ch;
q.push(p->rchild);
}
}
}