二叉树的存储结构
typedf struct tree
{
char data; //1个数据域
struct tree *lchild,*rchild; //2个指针域(左子树、右子树)
}node,*tree;
遍历二叉树
二叉树遍历的概念:按照一定次序访问树中所有结点,且每个结点仅被访问一次的过程。
先序遍历:(1)访问根结点
(2)先序遍历左子树
(3)先序遍历右子树
栗子:如上图先序遍历的结果为:124753689
代码如下:
void preorder(tree *&bt){ //先序遍历根结点为bt的二叉树的递归算法
if (bt)
{
printf("%c",bt->data); //访问根结点
preorder(bt->lchild); //先序遍历左子树
preorder(bt->rchild); //先序遍历右子树
}
}
补充‘&bt’:
引例:交换a和b的值。(比较以下两个函数哪个能实现)
void swap1(int a,int b){
int t;
t=a;a=b;b=t;
}
void swap2(int &a,int &b){
int t;
t=a;a=b;b=t;
}
显然,swap2函数才能实现a和b值的交换。其关键在于形参传递:int &a = x(实参),则a就是x,两者地址一样,相当于就是x换了个名字。
中序遍历:(1)中序遍历左子树
(2)访问根结点
(3)中序遍历右子树
栗子:如上图中序遍历的结果为:742513869
代码如下:
void inorder(tree *&bt){ //中序遍历根结点为bt的二叉树的递归算法
if (bt)
{
inorder(bt->lchild); //中序遍历左子树
printf("%c",bt->data); //访问根结点
inorder(bt->rchild); //中序遍历右子树
}
}
后序遍历:(1)后序遍历左子树
(2)后序遍历右子树
(3)访问根结点
栗子:如上图中序遍历的结果为:745289631
代码如下:
void postorder(tree *&bt){ //后序遍历根结点为bt的二叉树的递归算法
if (bt)
{
postorder(bt->lchild); //后序遍历左子树
postorder(bt->rchild); //后序遍历右子树
printf("%c",bt->data); //访问根结点
}
}
建立二叉树
void pre_crt(tree *&bt){ //pre:按先序次序输入结点 crt:建立二叉树
char ch;
scanf("%c",&ch); //输入'$'表示空树
if (ch!='$')
{
bt->data=ch;
pre_crt(bt->lchild); //建立左子树
pre_crt(bt->rchild); //建立右子树
}
else bt=NULL;
}