多叉树转换为二叉树算法

#include<iostream>
#include <string>
using namespace std;

struct Node    // 以表的形式存储的树结点
{
    char data;
    int parent;
    int lchild;
    int rchild;
};

struct TreeNode // 以二叉链表存储的树结点
{
    char data;
    TreeNode *l;
    TreeNode *r;
};

// 创建树的表并转化为二叉树
int creattable(Node table[])
{
    int n, k, i, j;
    cout << "输入结点个数(<20): ";
    cin >> n;
    if (n > 0)
    {
        cout << "输入结点信息和双亲编号(第一个请输入根结点信息如a -1 ):" << endl;
        for (i = 0; i < n; i++)
        {
            cin >> table[i].data >> table[i].parent;
            table[i].lchild = table[i].rchild = 0;
        }
        for (i = 0; i < n; i++)
        {
            for (j = 1; j < n; j++)
            {
                if (table[j].parent == i)
                {
                    if (table[i].lchild == 0)
                    {
                        table[i].lchild = j;
                        k = j;
                    }
                    else
                    {
                        table[k].rchild = j;
                        k = j;
                    }
                }
            }
        }
        for (i = 0; i < n; i++)
        {
            cout << table[i].data << table[i].parent << table[i].lchild << table[i].rchild << endl;
        }
    }
    return n;
}

// 将表转化为二叉链表
void Build(TreeNode *&current, Node node[], int pos, int n)
{
    if (n > 0)
    {
        if (current == 0)
        {
            current = new TreeNode;
            current->l = current->r = 0;
        }
        current->data = node[pos].data;
        if (node[pos].lchild)
            Build(current->l, node, node[pos].lchild, n);
        if (node[pos].rchild)
            Build(current->r, node, node[pos].rchild, n);
    }
}

// 访问结点
void Visit(TreeNode *current)
{
    cout<<current->data<<" ";
}

// 按先序遍历
void Preorder(TreeNode *root)
{
   TreeNode *current = root;
   if (current != 0)
   {
        Visit(current);
        Preorder(current->l);
        Preorder(current->r);
   }
}

int main()
{
    Node node[20];
    int n = creattable(node);
    TreeNode *root = 0;

    Build(root, node, 0, n);
    if (root)
    {
        cout << "先序遍历:";
        Preorder(root);
        cout << endl;
    }
    else
    {
        cout << "空树!" << endl;
    }

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值