二叉樹
二叉樹(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);//顯示結點數據,可以更改爲其它對結點操作
}