《算法笔记》第4章 入门篇(2)---算法初步 9.3 树的遍历

9.3.1 树的静态写法:

在这里插入图片描述

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

在这里插入图片描述

struct node
{
    typename data;   //数据域
    vector<int> child;    //指针域,存放所有子节点下标
}Node[maxn];

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9.3.2 树的先根遍历

在这里插入图片描述

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的所有子节点
    
}

9.3.3 树的层序遍历:

在这里插入图片描述

void LayerRoot(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 data;
    int layer;    //记录层号
    vector<int> child;
};
//void类型函数 LayerOrder,形参为int类型 root
//int类型队列Q
//记录根结点层号为0
//while循环:取出队首元素-》访问当前结点的数据域-》队首元素出列-》for循环遍历当前结点的所有孩子,并将数字记录在
//child中,child对应的Node类型的数组的层数为当前结点的node类型参数+1
//将所有的子节点入队列
void LayerOrder(int root)
{
    queue<int> q;
    q.push(root);             //将根结点入队
    Node[root].layer=0;        //记录根结点层号为0
    while(!q.empty())
    {
        int front=q.front();
        cout << Node[front].data;
        q.pop();          //弹出队首元素
        for(int i=0; i<Node[front].child.size(); i++)
        {
            int child=Node[front].child[i];      
            Node[child].layer=Node[front].layer+1;        //子节点层号为当前结点层号+1
        }
        q.push(child);       //将当前结点的所有子节点入队列   
    }
}

9.3.4从树的遍历看DFS和BFS

在这里插入图片描述

类似于图中走迷宫,只要遇到岔路口就继续深入下去,一直到遍历完所有的岔路口,不碰到死胡同不回头

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值