二叉树的链表建立和遍历
Posted 拉风小宇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的链表建立和遍历相关的知识,希望对你有一定的参考价值。
一般的树可以通过“父子-堂兄弟”关系转变为二叉树,如下图所示
然后再旋转45度即可变为二叉树(真的好聪明2333)
下面看一下二叉树的名片
类型名称:二叉树
数据对象集:一个有穷的结点集合
若不为空,则由根节点和其左、右二叉子树组成
操作集:BT∈BinTree,Item∈ElementType,重要操作有:
1、Boolean IsEmpty(BinTree BT):判断FT是否为空
2、void Traversal(BinTree BT):遍历,按某顺序访问每个结点
3、BinTree CreateBinTree():创建一个二叉树
常用的遍历方法有三种
树的建立有下面两种代码的实现方式
Ptree createTree() //树的建立
char ch;
Ptree t;
ch=getchar(); //输入二叉树数据
if(ch==' ') //判断二叉树是否为空
t=NULL;
else
t=(Ptree)malloc(sizeof(Ptree)); //二叉树的生成
t->data=ch;
t->lchild=createTree();
t->rchild=createTree();
return t;
和
void createBiTree(BiTree &T)
char c;
scanf("%c",&c);
if('#' == c)
T = NULL;
else
T = new BiTreeNode;
T->data = c;
createBiTree(T->leftChild);
createBiTree(T->rightChild);
都是依照前序遍历的方法做递归得到的结果
假设二叉树为:
a
b c
d e
因为程序中要知道叶子结点(终点),所以要将上面的二叉树变成扩展二叉树 (把叶子结点的孩子补成#, 用作标记), 扩展后就变成了:
a
b c
# d # e
# # # #
那么,在输入的时候,需要输入: ab#d##C#e##
遍历的方法有前序遍历、中序遍历和后序遍历三种
#include "stdio.h"
#include "stdlib.h"
typedef struct tree
char data;
struct tree *lchild;
struct tree *rchild;
*Ptree;
Ptree createTree() //树的建立
char ch;
Ptree t;
ch=getchar(); //输入二叉树数据
if(ch==' ') //判断二叉树是否为空
t=NULL;
else
t=(Ptree)malloc(sizeof(Ptree)); //二叉树的生成
t->data=ch;
t->lchild=createTree();
t->rchild=createTree();
return t;
void preOrder(Ptree t) //先序遍历
if(t)
printf("%c",t->data);
preOrder(t->lchild);
preOrder(t->rchild);
void intOrder(Ptree t) //中序遍历
if(t)
intOrder(t->lchild);
printf("%c",t->data);
intOrder(t->rchild);
void postOrder(Ptree t) //后序遍历
if(t)
postOrder(t->lchild);
postOrder(t->rchild);
printf("%c",t->data);
void main()
Ptree t;
printf("先序创建二叉树,用空格代表虚结点:\\n");
t=createTree();
printf("前序遍历:");
preOrder(t) ;
printf("\\n");
printf("中序遍历:");
intOrder(t);
printf("\\n");
printf("后序遍历:");
postOrder(t);
printf("\\n");
system("pause");
输入上面的例子、执行效果是如下图
其执行原理是
下一章博客将讲述怎样把递归的转化为非递归的
以上是关于二叉树的链表建立和遍历的主要内容,如果未能解决你的问题,请参考以下文章
二叉树有关习题整理145二叉树的后序遍历 94二叉树的中序遍历 572另一棵树的子树 236二叉树的最近公共祖先 JZ36二叉搜索树与双向链表 - 牛客