1.链式存储方式遍历
链表中每个结点由3个域组成
lchild(左子树) | data(某结点数据信息) | rchild(右子树) |
描述为:
typedef struct bitnode
{
datatype data;
struct binode *lchild,*rchild;
}Bitnode,*Bitree;
Bitree t;//指向二叉树的指针变量
2.递归实现三种遍历方式
- 先序遍历(根节点-->左子树-->右子树)
-
void PreOrder { if(bt==NULL) return ; //递归调用结束条件 Visit(bt); //访问根节点 PreOrder(bt->lchild); //先序遍历bt的左子树 PreOrder(bt->rchild);//先序遍历bt的右子树 }
- 中序遍历(左子树-->根节点-->右子树)
void InOrder(BiTree bt) { if(bt==NULL) return ; InOrder(bt->lchild); //中序递归遍历bt的左子树 Visit(bt); //访问根节点 InOrder(bt->rchild); //中序递归遍历bt的右子树 }
- 后序遍历(左子树-->右子树-->根节点)
void PostOrder(BiTree bt) { if(bt==NULL) return ; PostOrder(bt->lchild); //后序遍历bt的左节点 PostOrder(bt->rchild); //后序遍历bt的右节点 Visit(bt); //访问根节点 }
例题
新二叉树
题目描述
输入一串二叉树,输出其前序遍历。
输入格式
第一行为二叉树的节点数 n。(1 <= n <= 26)
后面 n 行,每一个字母为节点,后两个字母分别为其左右儿子。特别地,数据保证第一行读入的节点必为根节点。
空节点用 * 表示
输出格式
二叉树的前序遍历。
样例 #1
样例输入 #1
6
abc
bdi
cj*
d**
i**
j**
样例输出 #1
abdicj
思路
把树的每层看成一个二维数组的每一层,将根结点当做数组的下标,将左子树存放于[ 1 ],右子树存放于[2];然后便利的时候按照根结点-->左结点-->右结点的顺序,一次遍历取数。
//先序遍历:中左右
#include<stdio.h>
#include<stdlib.h>
typedef struct tree
{
char data;
char lchild;
char rchild;
}node;
node trees[300];
void order(char ch)
{
if(ch=='*')
{
return ;
}
printf("%c",ch); //输出结点
order(trees[ch].lchild); //先序遍历左子树
order(trees[ch].rchild);
}
int main()
{
int n;
char str[100][100];
scanf("%d",&n);
int count=0;
for(int i=0;i<n;i++)
scanf("%s",str[i]);
for(int i=0;i<n;i++)
for(int j=0;j<3;j++)
{
trees[i].data=str[i][0]; //根结点
trees[str[i][0]].lchild=str[i][1]; //左子树
trees[str[i][0]].rchild=str[i][2]; //右子树
}
order(trees[count].data);
return 0;
}