寒假学习记录–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一起加油呀!