二叉树(Binary Tree):
定义:二叉树是n(n>=0)个结点的优先集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。
链式存储结构(二叉链表):由一个数据域(data)和两个指针域构成(lchild,rchild分别指向左右孩子)。如下图:
例如:
二叉链表的结点结构定义代码:
typedef struct BiTNode /* 结点结构 */
{
TElemType data; /* 结点数据 */
struct BiTNode *lchild,*rchild; /* 左右孩子指针 */
}BiTNode,*BiTree;二叉树遍历(traversing binary tree):
是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且被访问一次。
遍历方法有:前序遍历,中序遍历,后序遍历。
前序遍历规则:若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,在前序遍历右子树。如下图,前序遍历结果为:ABDGHCEIF。
前序遍历实现代码:
void PreOrderTraverse(BiTree T)
{
if(T==NULL)
return;
printf("%c",T->data);/* 显示结点数据,可以更改为其它对结点操作 */
PreOrderTraverse(T->lchild); /* 再先序遍历左子树 */
PreOrderTraverse(T->rchild); /* 最后先序遍历右子树 */
}中序遍历规则:若二叉树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后是访问根结点,最后中序遍历右子树。如下图中序遍历结果为:GDHBAEICF。中序遍历代码实现:
void InOrderTraverse(BiTree T)
{
if(T==NULL)
return;
InOrderTraverse(T->lchild); /* 中序遍历左子树 */
printf("%c",T->data);/* 显示结点数据,可以更改为其它对结点操作 */
InOrderTraverse(T->rchild); /* 最后中序遍历右子树 */
}后序遍历规则:若二叉树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后是访问根结点。如下图,后序遍历结果为:GHDBIEFCA。后序遍历代码实现:
void PostOrderTraverse(BiTree T)
{
if(T==NULL)
return;
PostOrderTraverse(T->lchild); /* 先后序遍历左子树 */
PostOrderTraverse(T->rchild); /* 再后序遍历右子树 */
printf("%c",T->data);/* 显示结点数据,可以更改为其它对结点操作 */
}
二叉树的建立:
下面利用前序输入树中结点的值,递归来建立二叉树,最后利用前序遍历输出来验证二叉树是否构建成功。
例如建立如下图的二叉树:
为了确定每个结点是否有左右孩子,我们对其进行扩展,利用“#”表示空指针引出的虚结点,则扩展二叉树如下:
对扩展二叉树进行前序遍历,AB#D##C##。
c++实现:
#include <iostream>
using namespace std;
typedef struct node
{
struct node *lchild;
struct node *rchild;
char data;
}BiTreeNode, *BiTree;
//按前序输入二叉树中结点的值
//构造二叉树表表示二叉树T
void CreateBiTree(BiTree &T)
{
char ch;
cin>>ch;
if(ch=='#')
T=NULL;
else
{
T= new BiTreeNode;
if(!T) exit(0);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
//前序递归遍历二叉树
void PreOrderTraverse(BiTree &T)
{
if(T)//当结点不为空的时候执行
{
cout<<T->data;
PreOrderTraverse(T->lchild);//
PreOrderTraverse(T->rchild);
}
else cout<<"";
}
int main()
{
BiTree T;
cout<<"输入对扩展二叉树的前序遍历序列:"<<endl;
CreateBiTree(T);
cout<<"输出前序遍历结果:"<<endl;
PreOrderTraverse(T);
cout<<endl;
return 0;
}测试结果:
参考:
- 《大话数据结构》
- 《算法导论》
本文介绍了二叉树的基本概念,包括定义和链式存储结构,重点讨论了二叉链表的节点结构。文章还详细讲解了二叉树的三种遍历方式——前序遍历、中序遍历和后序遍历,并提供了前序遍历的具体例子。通过阅读,读者可以理解二叉树遍历的原理和应用。
&spm=1001.2101.3001.5002&articleId=52215471&d=1&t=3&u=f151e724769142fbb1168e7e72c73557)
7816

被折叠的 条评论
为什么被折叠?



