二叉樹相關概念及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);//顯示結點數據,可以更改爲其它對結點操作
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章