层序遍历:
除根结点外,每一层结点的父结点正好是上一层的所有结点。所以需要借助队列结构,存放结点地址。
先将根结点入队,然后进入循环:获取队头结点,判断其是否有子结点,有则入队,然后输出当前结点的值(或其他遍历方式),最后将该结点出队,重复这个过程,直到队列为空。
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);
}
}
}
博客介绍了二叉树的层序遍历与建立方法。层序遍历需借助队列,先将根结点入队,循环判断队头结点有无子结点,有则入队,输出结点值后出队。层序建立逻辑类似,用#代表空结点,根据输入字符构建左右子树,直至队列为空。
6694

被折叠的 条评论
为什么被折叠?



