数据结构学习之--树的遍历

寒假学习记录–001

今天学习的是数据结构有关树的遍历的知识点。以下将会讲到树的几种基本的的遍历方式,以及通过例题来巩固知识点。

二叉树的遍历

二叉树的遍历是指通过一定顺序访问二叉树的所有结点。
一般有四种方法:先序遍历、中序遍历、后序遍历、层序遍历。
前三种一般使用深度优先搜索DFS实现,而层序遍历一般使用广度优先搜索BFS来实现。
首先给出二叉树的结构:

typedef struct Node{
    int data;
    struct Node *left,*right;
}Node,*Tree;

先序遍历,中序遍历以及后序遍历

思路:先访问根结点,再去访问左右子树。
方法:递归实现

void preorder(Tree tree)
{
	if(tree == NULL)
		return;    //递归边界
	cout<<tree->data<<endl;
	preorder(tree->left);
	preorder(tree->right);
}

同理,中序遍历与后序遍历都是通过递归来实现。其代码如下:

void inorder(Tree tree)
{
	if(tree == NULL)
		return;    //递归边界
	preorder(tree->left);
	cout<<tree->data<<endl;
	preorder(tree->right);
}
void postorder(Tree tree)
{
	if(tree == NULL)
		return;    //递归边界
	preorder(tree->left);
	preorder(tree->right);
	cout<<tree->data<<endl;
}

总结:无论是哪一种遍历,都必须要知道中序遍历序列才能唯一确定一颗树。

层序遍历

层序遍历是指按层次的顺序从根结点向下逐层进行遍历,且对于同一层从左到右遍历。
其实二叉树的遍历问题的核心在于:二维结构的线性化。
思路:从结点访问左右儿子(根入队->访问结点->入队左右儿子)。通过队列、数组都能够实现。
方法一:队列实现层序遍历

void order(Tree tree)//层序遍历
{
    if(!tree)
        return;//空树直接返回
    queue<Tree>q;
    q.push(tree);
    while(!q.empty())
    {
        Tree t=q.front();//取队首元素
        cout<<t->data<<" ";
        if(t->left)
        {
            q.push(t->left);
        }
        if(t->right)
        {
            q.push(t->right);
        }
        q.pop();
    }
}

方法二:数组实现层序遍历

void order(Tree tree)//层序遍历
{
    Tree temp[100];
    int in=0;
    int out=0;

    temp[in++]=tree;//存根结点
    while(in>out)
    {
        if(temp[out])
        {
            cout<<temp[out]->data<<" ";
            temp[in++]=temp[out]->left;
            temp[in++]=temp[out]->right;
        }
        out++;
    }
}

例题:

给定一棵树的后序遍历与中序遍历的遍历序列,重建这颗二叉树。

Tree create(int n,int *aft,int *mid)
{
    if(n==0)
        return NULL;
    Tree tree=(Tree)malloc(sizeof(Node));
    tree->data=aft[n-1];
    tree->left=tree->right=NULL;

    int i;
    for(i=0;mid[i]!=aft[n-1];i++);
    tree->left=create(i,aft,mid);
    tree->right=create(n-1-i,aft+i,mid+i+1);
    return tree;
}

今日学习分享就这些啦!要和yph一起加油呀!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值