二叉树的遍历是指按某条搜索路径访问树中的每个结点,使得每个结点均被访问一次,而且仅能访问一次(说明不可二次访问,一遍而过)。遍历一颗二叉树便要决定对根结点N、左子树L和右子树的访问顺序。 二叉树常的的遍历方法有前序遍历(NLR)、中序遍历(LNR)和后序遍历(LRN)三种遍历算法,其中 “序” 指的是根结点在何时被访问。三种遍历方法有递归和非递归两个版本。
前序遍历的算法思路:
若二叉树为空,什么都不做,否则:
i、先访问根结点;
ii、再前序遍历左子树;
iii、最后前序遍历右子树;
中序遍历算法思路:
二叉树为空,什么也不做,否则:
i、中序遍历左子树;
ii、访问根结点;
iii、中序遍历右子树
算法思路:
若二叉树为空,什么也不做,否则:
i、后序遍历左子树
ii、后序遍历右子树
iii、访问根结点
F
/ \
C E
/ \ \
A B G
/
D
#include<bits/stdc++.h>
using namespace std;
struct node{
char data;//节点
int left;//左子树
int right;//右子树
}a[30];
void preorder(int x){//先序遍历
if(x==0)return;
cout<<a[x].data;
preorder(a[x].left);
preorder(a[x].right);
}
void inorder(int x){//中序遍历
if(x==0)return;
inorder(a[x].left);
cout<<a[x].data;
inorder(a[x].right);
}
void postorder(int x){//后序遍历
if(x==0)return;
postorder(a[x].left);
postorder(a[x].right);
cout<<a[x].data;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i].data>>a[i].left>>a[i].right;
preorder(1);
cout<<endl;
inorder(1);
cout<<endl;
postorder(1);
}