树的孩子兄弟表示法(C/C++)

创建:

和二叉树一样结点内部拥有两个指针,不过不是指向左右子树,而是指向孩子结点和兄弟结点。兄弟结点之间互相连接,在同一层,孩子结点在下一层,结构像广义表,45度观看又像二叉树。创建方式类似二叉树的层序建立,也需要借助队列结构。
先处理根结点,获取第一个输入字符,保存至根结点中,将该结点入队,然后进入循环:
数据优先存放到某结点的子树中,然后再存放到其兄弟结点中。
获取队头结点,并让其出队。获取输入字符,将其保存至当前结点的长子结点(第一个孩子结点,即直接与父结点相连的子结点)中,然后长子结点入队,接下来在遇到井号之前,数据会循环保存到长子结点的兄弟结点中(当前结点的所有子结点),且将兄弟结点入队。重复上述过程,直到队列为空。

//定义结点
typedef struct mytree
{
    char data;
    mytree *child=nullptr;
    mytree *brother=nullptr;
}mytree;
void creat_tree(mytree *&T)
{
    queue<mytree*> q;
    mytree *p=T;
    char ch;
    cin >> ch;
    if(ch!='#')
    {
        T=new mytree;
        T->data=ch;
        q.push(T);
    }
    while(!q.empty())
    {
        p=q.front();
        q.pop();
        cin >> ch;
        if(ch!='#')
        {
            //先将数据存放到长子中,并将其入队
            p->child=new mytree;
            p->child->data=ch;
            q.push(p->child);
            //p指向该结点的长子,在遇到#之前,接下来的字符都存放在长子的兄弟中
            p=p->child;
            cin >> ch;
            while(ch!='#')
            {
                p->brother=new mytree;
                p->brother->data=ch;
                q.push(p->child);
                p=p->brother;//指向下一个兄弟
                cin >> ch;
            }
        }
    }
}
先根遍历:

先访问父节点,再递归访问其子结点和兄弟结点。逻辑类似二叉树的先序遍历。

void PreOrderTraverse(mytree *&T)
{
    if(T!=nullptr)
    {
       cout << T->data << endl;
       PreOrderTraverse(T->child);
       PreOrderTraverse(T->brother);
    }
}
后根遍历:

与先根遍历相反,先递归访问父节点的子结点和兄弟结点,再访问父节点。逻辑类似二叉树的后序遍历。

void PostOrderTraverse(mytree *&T)
{
   if(T!=nullptr)
    {
       PostOrderTraverse(T->child);
       PostOrderTraverse(T->brother);
       cout << T->data << endl;
    }
}
  • 1
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值