树的遍历

树的静态写法

用数组下标代替所谓的地址

struct node{
    typename data; //数据域
    int child[maxn]; //指针域,存放所有子结点的下标
}Node[maxn]; //结点数组,maxn为结点上限个数

当无法预知子结点个数时,可以使用vetctor

struct node{
    typename data; //数据域
    vector child[maxn]; //指针域,存放所有子结点的下标
}Node[maxn]; //结点数组,maxn为结点上限个数

需要新建一个结点,就按顺序从数组中取出一个下标即可:

int index = 0;
int newNode(int v)
{
    Node[index].data = v; //数据域为v
    Node[index].child.clear(); //清空子结点
    return index++; //返回结点下标,并令index自增
}

树的先根遍历

先访问根结点,再访问所有子树

void PreOrder(int root)
{
    printf("%d ", Node[root].data); //访问当前结点
    for(int i = 0; i < Node[root].child.size(); i++)
    {
        PreOrder(Node[root].child[i]); //递归访问结点root的所有子结点
    }
}

树的层序遍历

从树根开始,一层一层向下遍历

void LayerOrder(int root)
{
    queue<int> Q;
    Q.push(root); //将根结点入队
    while(!Q.empty())
    {
        int front = Q.front(); //取出队首元素
        printf("%d ", Node[front].data); //访问当前结点的数据域
        Q.pop(); //队首元素出队
        for(int i = 0; i < Node[front].child.size(); i++)
        {
            Q.push(Node[front].child[i]); //将当前结点的所有子结点入队
        }
    }
}

对结点的层号进行求解

struct node{
    int layer;
    int data;
    vector<int> child;
};

树的层次遍历

void LayerOrder(int root)
{
    queue<int> Q;
    Q.push(root); //将根结点入队
    Node[root].layer = 0; //记根结点的层号为0
    while(!Q.empty())
    {
        int front = Q.front(); //取出队首元素
        printf("%d ", Node[front].data); //访问当前结点的数据域
        Q.pop(); //队首元素
        for(int i = 0; i < Node[front].child.size(); i++)
        {
            int child = Node[front].child[i]; //当前结点的第i个子结点的编号
            //子结点层号为当前结点层号加1
            Node[child].layer = Node[front].layer+1; 
            Q.push(child); //将当前结点的所有子结点入队
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳光开朗男孩

你的鼓励是我最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值