二叉树相关概念及c语言实现~DS笔记⑥

二叉树

二叉树(Binary Tree):是n(n>=0)个结点的有限集合,该集合或者为空集,或者是由一个根节点和两颗互不相交的、分别为根节点的子二叉树组成。

二叉树的特点:每个结点最多有两个子树,且左右有序,不可颠倒。

斜树:所有节点都只有左子树,或只有右子树的二叉树,分别称为左斜树和右斜树,统称为斜树。

满二叉树:在一棵二叉树中,所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上。

完全二叉树:对于一颗具有n个结点的二叉树按层序编号,编号为i(1<=i且i<=n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中的位置完全相同。

顺序结构的二叉树

头文件即初始设置

#include<stdio.h>
#include<math.h>
#include "string.h"
#include<malloc.h>

#define MAXSIZE 128 /* 存储空间初始分配量 */

typedef char TElemType;
typedef enum{ False = 0, True = 1 }Bool;//用枚举写的一个简单的bool
typedef TElemType SqBiTree[MAXSIZE];

TElemType Nil = ' '; /* 字符型以空格符为空 */

结构体

typedef struct BiTNode  /* 结点结构 */
{
 TElemType data;  /* 结点数据 */
 struct BiTNode *lchild, *rchild; /* 左右孩子指针 */
}BiTNode, *BiTree;

初始化二叉树数组

int index = 1;		//索引,因为0存放元素个数,所以从1开始
typedef char String[24]; /*  0号单元存放串的长度 */
String str;

Bool StrAssign(String T, char *chars)
{
 int i;
 if (strlen(chars)>MAXSIZE)
  return False;
 else
 {
  T[0] = strlen(chars);		//存放长度
  for (i = 1; i <= T[0]; i++)
   T[i] = *(chars + i - 1);	//从字符串依次赋值给数组
  return True;
 }
}

构造空二叉树

Bool InitBiTree(BiTree *T)
{
 *T = NULL;
 return True;
}

前序构造二叉树

void CreateBiTree(BiTree *T)
{
 TElemType ch;
 /* scanf("%c",&ch); */
 ch = str[index++];
 if (ch == '#')	//#表示空树
  *T = NULL;
 else
 {
  *T = (BiTree)malloc(sizeof(BiTNode));
  if (!*T)
   exit(OVERFLOW);
  (*T)->data = ch; /* 生成根结点 */
  CreateBiTree(&(*T)->lchild); /* 构造左子树 */
  CreateBiTree(&(*T)->rchild); /* 构造右子树 */
 }
}

访问

Bool visit(TElemType e)
{
 printf("%c ", e);
 return True;
}

销毁二叉树

void DestroyBiTree(BiTree *T)
{
 if (*T)
 {
  if ((*T)->lchild) /* 若有左孩子 */
   DestroyBiTree(&(*T)->lchild); /* 销毁左孩子子树 */
  if ((*T)->rchild) /* 若有右孩子 */
   DestroyBiTree(&(*T)->rchild); /* 销毁右孩子子树 */
  free(*T); /* 释放根结点 */
  *T = NULL; /* 空指针赋0 */
 }
}

清空二叉树

#define ClearBiTree DestroyBiTree

二叉树是否空

Bool BiTreeEmpty(BiTree T)
{
 if (T)
  return False;
 else
  return True;
}

返回二叉树深度

int BiTreeDepth(BiTree T)
{
 int i, j;
 if (!T)
  return 0;
 if (T->lchild)
  i = BiTreeDepth(T->lchild);
 else
  i = 0;
 if (T->rchild)
  j = BiTreeDepth(T->rchild);
 else
  j = 0;
 return i>j ? i + 1 : j + 1;
}

返回根

TElemType Root(BiTree T)
{
 if (BiTreeEmpty(T))
  return Nil;		//见初始设定
 else
  return T->data;
}

返回结点值

TElemType Value(BiTree p)
{
 return p->data;
}

修改结点值

void Assign(BiTree p, TElemType value)
{
 p->data = value;
}

前序递归遍历

void PreOrderTraverse(BiTree T)
{
 if (T == NULL)
  return;
 printf("%c", T->data);//显示结点数据,可以更改为其它对结点操作
 PreOrderTraverse(T->lchild); //再先序遍历左子树
 PreOrderTraverse(T->rchild); //最后先序遍历右子树
}

中序递归遍历

void InOrderTraverse(BiTree T)
{
 if (T == NULL)
  return;
 InOrderTraverse(T->lchild); //中序遍历左子树
 printf("%c", T->data);//显示结点数据,可以更改为其它对结点操作
 InOrderTraverse(T->rchild); //最后中序遍历右子树
}

后序递归遍历

void PostOrderTraverse(BiTree T)
{
 if (T == NULL)
  return;
 PostOrderTraverse(T->lchild); //先后序遍历左子树
 PostOrderTraverse(T->rchild); //再后序遍历右子树
 printf("%c", T->data);//显示结点数据,可以更改为其它对结点操作
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章