树与二叉树
树与二叉树
Hokori树其实就是一个有n个节点的有限集合,二叉树是树的一种特殊形式,通过树结构可以让我们去解决查找及其排序的一些问题。有关树结构,最主要的就是二叉树的遍历与排序了。
其中二叉树的遍历又分为三种操作,先序遍历,中序遍历和后序遍历,但是其实只是把需要进行的操作顺序改变一下,原理基本没有变化,还有第四种操作就是层序遍历。以下是先序遍历创建二叉树的代码:
<code lang="c++">
void CreateBiTree(BiTree *T)
{
char ch;
cin >> ch;
if (ch == '#')
*T = NULL; //保证是叶结点
else
{
*T = (BiTree)malloc(sizeof(BiTNode));
//if (!*T)
//exit(OVERFLOW); //内存分配失败则退出。
(*T)->data = ch;//生成结点
CreateBiTree(&(*T)->lchild);//构造左子树
CreateBiTree(&(*T)->rchild);//构造右子树
}
}
</code>
再接下来是二叉树遍历的代码:
<code lang="c++">
void PreOrderTraverse(BiTree T, int level)
{
if (T == NULL)
return;
/*此处表示对遍历的树结点进行的操作,根据你自己的要求进行操作,这里只是输出了结点的数据*/
//operation1(T->data);
operation2(T->data, level); //输出了层数
PreOrderTraverse(T->lchild, level + 1);
PreOrderTraverse(T->rchild, level + 1);
}
</code>
其中,operation是指当访问结点时,对结点的操作。
二叉树是的先序遍历是用递归函数去实现对二叉树的遍历与创建。
接下来是二叉树的层序遍历,二叉树的层序遍历需要借助一个队列来进行节点暂时的存储,这个队列需要是BiTree类型的队列,可以借助二叉树的结构体。
二叉树节点结构体如下:
<code lang="c++">
struct BiTree
{
char data;
BiTree *lchild,*rchild;
};
</code>
二叉树层序遍历的函数如下:
<code lang="c++">
void LevelOrder(BiTree root)
{
BiTree Q[100],q;
int front,rear;
if(root==NULL) return;
Q[++rear]=root; //将根节点入队
while(front!=rear){ //利用循环进行遍历
q=Q[++front]; //将队首元素出队
visit(q->data); //访问节点
if(q->lchild!=NULL) Q[++rear]=q->lchild; //将左孩入队
if(q->rchild!=NULL) Q[++rear]=q->rchild; //将右孩入队
}
</code>
还有一个线索二叉树,可以说是二叉树的升级版,主要是因为一般二叉树遍历易于查找孩子而不易查找双亲,而且二叉树如果只有n个节点,则会浪费n+1个指针域空间,为此,增加了两个线索参数,ltag,rtag,特意用来判断指针域指示节点是否还有孩子,如果有则ltag/rtag = 0 ,否则为1,若为1,则把节点相应的指针域指向节点的前驱,表示如下:
ltag = 0 lch域指示节点的左孩子
ltag = 1 lch域指示节点的前驱
对于树,有些树不知有两个孩子,要将其转化成二叉树更方便理解与计算,于是就有了孩子兄弟表示法,即左子树为孩子,右子树为兄弟。
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果