顺序存储
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "time.h"
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100
#define MAX_TREE_SIZE 100
typedef int Status;
typedef int CElemType;
typedef CElemType SqBiTree[MAX_TREE_SIZE];
CElemType Nil = 0;
typedef struct {
int level;
int order;
}Position;
#pragma mark -- 二叉树的基本操作
Status visit(CElemType c) {
printf("%d ",c);
return OK;
}
Status InitBiTree(SqBiTree T) {
for (int i = 0; i < MAX_TREE_SIZE; i++) {
T[i] = Nil;
}
return OK;
}
Status CreateBiTree(SqBiTree T) {
int i = 0;
while (i < 10) {
T[i] = i+1;
printf("%d ",T[i]);
if (i != 0 && T[(i+1)/2-1] == Nil && T[i] != Nil) {
printf("出现无双亲的非根结点%d\n",T[i]);
exit(ERROR);
}
i++;
}
while (i < MAX_TREE_SIZE) {
T[i] = Nil;
i++;
}
return OK;
}
#define ClearBiTree InitBiTree
Status BiTreeEmpty(SqBiTree T) {
if (T[0] == Nil)
return TRUE;
return FALSE;
}
int BiTreeDepth(SqBiTree T) {
int j = -1;
int i;
for (i = MAX_TREE_SIZE-1 ; i>=0; i--) {
if (T[i] != Nil)
break;
}
do {
j++;
} while ( powl(2, j) <= i);
return j;
}
CElemType Value(SqBiTree T,Position e) {
printf("%d\n",(int)pow(2,e.level-1));
printf("%d\n",e.order);
return T[(int)pow(2, e.level-1)+e.order-2];
}
Status Root(SqBiTree T,CElemType *e) {
if (BiTreeEmpty(T)) {
return ERROR;
}
*e = T[0];
return OK;
}
Status Assign(SqBiTree T,Position e,CElemType value) {
int i = (int)powl(2, e.level-1)+e.order -2;
if (value != Nil && T[(i+1)/2-1] == Nil) {
return ERROR;
}
if (value == Nil && (T[i*2+1] != Nil || T[i*2+2] != Nil)) {
return ERROR;
}
T[i] = value;
return OK;
}
CElemType Parent(SqBiTree T, CElemType e) {
if (T[0] == Nil) {
return Nil;
}
for (int i = 1 ; i < MAX_TREE_SIZE; i++) {
if (T[i] == e) {
return T[(i+1)/2 - 1];
}
}
return Nil;
}
CElemType LeftChild(SqBiTree T,CElemType e) {
if (T[0] == Nil) {
return Nil;
}
for (int i = 0 ; i < MAX_TREE_SIZE-1; i++) {
if (T[i] == e) {
return T[i*2+1];
}
}
return Nil;
}
CElemType RightChild(SqBiTree T,CElemType e) {
if (T[0] == Nil) {
return Nil;
}
for (int i = 0 ; i < MAX_TREE_SIZE-1; i++) {
if (T[i] == e) {
return T[i*2+2];
}
}
return Nil;
}
CElemType LeftSibling(SqBiTree T,CElemType e) {
if(T[0]==Nil)
return Nil;
for(int i=1;i<=MAX_TREE_SIZE-1;i++)
if(T[i]==e&&i%2==0)
return T[i-1];
return Nil;
}
CElemType RightSibling(SqBiTree T,CElemType e) {
if(T[0]==Nil)
return Nil;
for(int i=1;i<=MAX_TREE_SIZE-1;i++)
if(T[i]==e&&i%2==1)
return T[i+1];
return Nil;
}
#pragma mark -- 二叉树的遍历
void LevelOrderTraverse(SqBiTree T) {
int i = MAX_TREE_SIZE-1;
while (T[i] == Nil) i--;
for (int j = 0; j <= i; j++)
if (T[j] != Nil)
visit(T[j]);
printf("\n");
}
void PreTraverse(SqBiTree T,int e) {
visit(T[e]);
if (T[2 * e + 1] != Nil) {
PreTraverse(T, 2*e+1);
}
if (T[2 * e + 2] != Nil) {
PreTraverse(T, 2*e+2);
}
}
Status PreOrderTraverse(SqBiTree T) {
if (!BiTreeEmpty(T)) {
PreTraverse(T, 0);
}
printf("\n");
return OK;
}
void InTraverse(SqBiTree T, int e) {
if (T[2*e+1] != Nil)
InTraverse(T, 2*e+1);
visit(T[e]);
if (T[2*e+2] != Nil)
InTraverse(T, 2*e+2);
}
Status InOrderTraverse(SqBiTree T) {
if (!BiTreeEmpty(T)) {
InTraverse(T, 0);
}
printf("\n");
return OK;
}
void PostTraverse(SqBiTree T,int e) {
if(T[2*e+1]!=Nil)
PostTraverse(T,2*e+1);
if(T[2*e+2]!=Nil)
PostTraverse(T,2*e+2);
visit(T[e]);
}
Status PostOrderTraverse(SqBiTree T) {
if(!BiTreeEmpty(T))
PostTraverse(T,0);
printf("\n");
return OK;
}
let MAX_TREE_SIZE = 20
struct Position {
var level : Int
var order : Int
init(level:Int, order:Int) {
self.level = level
self.order = order
}
}
class Tree<T:Equatable> {
var data = Array<T?>(repeating: nil, count: MAX_TREE_SIZE)
func createtree(_ e:Array<T>) -> Void {
var i = 0
while i < 10 {
data[i] = e[i];
if (i != 0 && data[(i+1)/2-1] == nil && data[i] != nil) {
exit(0);
}
i += 1;
}
}
func clear() {
var i = 0
while i < MAX_TREE_SIZE {
data[i] = nil;
i += 1
}
}
func isEmpty() -> Bool {
return data[0] == nil ? true :false
}
func depth() -> Int {
var i = MAX_TREE_SIZE - 1
while i > 0 {
if data[i] == nil {
break
}
i -= 1
}
var j = -1
repeat {
j += 1
} while pow(2, Double(j)) < Double(i)
return j
}
func value(_ p:Position) -> T? {
return data[Int(pow(2, Double(p.level - 1))) + p.order - 2]
}
func root() -> T? {
return data[0]
}
func assign(_ e:T? ,p:Position) -> Bool {
let i = Int(pow(2, Double(p.level - 1))) + p.order - 2
if e != nil && data[(i+1)/2 - 1] == nil {
return false
}
if e == nil && (data[i*2+1] != nil || data[i*2+1] != nil) {
return false
}
data[i] = e
return true
}
func parent(_ e:T) -> T? {
if data[0] == nil {
return nil
}
var i = 1
while i < MAX_TREE_SIZE {
if let a = data[i] {
if a == e {
return data[(i+1)/2 - 1]
}
}
i += 1
}
return nil
}
func left(_ e:T) -> T? {
if data[0] == nil {
return nil
}
var i = 1
while i < MAX_TREE_SIZE {
if let a = data[i] {
if a == e {
return data[2*i+1]
}
}
i += 1
}
return nil
}
func right(_ e:T) -> T? {
if data[0] == nil {
return nil
}
var i = 1
while i < MAX_TREE_SIZE {
if let a = data[i] {
if a == e {
return data[2*i+2]
}
}
i += 1
}
return nil
}
func leftSibling(_ e:T) -> T? {
if data[0] == nil {
return nil
}
var i = 1
while i < MAX_TREE_SIZE {
if let a = data[i] {
if a == e && i%2 == 0{
return data[i-1]
}
}
i += 1
}
return nil
}
func rightSibling(_ e:T) -> T? {
if data[0] == nil {
return nil
}
var i = 1
while i < MAX_TREE_SIZE {
if let a = data[i] {
if a == e && i%2 == 1{
return data[i+1]
}
}
i += 1
}
return nil
}
func LevelOrderTraverse() -> Void {
var i = MAX_TREE_SIZE-1
while data[i] != nil {
i -= 1
}
var j = 0
while i > j {
if let a = data[j] {
print("\(a)", terminator:"")
}
j += 1
}
print("")
}
func PreOrderTraverse() -> Void {
if !isEmpty() {
PreTraverse(0)
}
print("")
}
func PreTraverse(_ e:Int) -> Void {
print(data[e]!,terminator:"")
if 2 * e + 2 < MAX_TREE_SIZE && data[2 * e + 1] != nil {
PreTraverse(2 * e + 1)
}
if 2 * e + 2 < MAX_TREE_SIZE && data[2 * e + 2] != nil {
PreTraverse(2 * e + 2)
}
}
func InOrderTraverse() -> Void {
if !isEmpty() {
InTraverse(0)
}
print("")
}
func InTraverse(_ e:Int) -> Void {
if 2 * e + 2 < MAX_TREE_SIZE && data[2 * e + 1] != nil {
InTraverse(2 * e + 1)
}
print(data[e]!,terminator:"")
if 2 * e + 2 < MAX_TREE_SIZE && data[2 * e + 2] != nil {
InTraverse(2 * e + 2)
}
}
func PostOrderTraverse() -> Void {
if !isEmpty() {
PostTraverse(0)
}
print("")
}
func PostTraverse(_ e:Int) -> Void {
if 2 * e + 2 < MAX_TREE_SIZE && data[2 * e + 1] != nil {
InTraverse(2 * e + 1)
}
if 2 * e + 2 < MAX_TREE_SIZE && data[2 * e + 2] != nil {
InTraverse(2 * e + 2)
}
print(data[e]!,terminator:"")
}
}
extension Tree : CustomStringConvertible {
var description: String {
return String(describing: data)
}
}
链式存储
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "time.h"
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100
typedef int Status;
#pragma mark--二叉树构造
int indexs = 1;
typedef char String[24];
String str;
Status StrAssign(String T,char *chars) {
int i;
if(strlen(chars)>MAXSIZE)
return ERROR;
else
{
T[0]=strlen(chars);
for(i=1;i<=T[0];i++)
T[i]=*(chars+i-1);
return OK;
}
}
#pragma mark--二叉树基本操作
typedef char CElemType;
CElemType Nil=' ';
typedef struct BiTNode /* 结点结构 */
{
CElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
Status visit(CElemType e) {
printf("%c ",e);
return OK;
}
Status InitBiTree(BiTree *T) {
*T=NULL;
return OK;
}
void DestroyBiTree(BiTree *T) {
if(*T) {
if((*T)->lchild)
DestroyBiTree(&(*T)->lchild);
if((*T)->rchild)
DestroyBiTree(&(*T)->rchild);
free(*T);
*T=NULL;
}
}
#define ClearBiTree DestroyBiTree
void CreateBiTree(BiTree *T) {
CElemType ch;
ch = str[indexs++];
if (ch == '#') {
*T = NULL;
} else {
*T = (BiTree)malloc(sizeof(BiTNode));
if (!*T) {
exit(OVERFLOW);
}
(*T)->data = ch;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
}
Status 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;
}
CElemType Root(BiTree T) {
if (BiTreeEmpty(T))
return Nil;
return T->data;
}
CElemType Value(BiTree p) {
return p->data;
}
void Assign(BiTree p,CElemType value) {
p->data=value;
}
#pragma mark--二叉树遍历
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);
}
let str = "ABDH#K###E##CFI###G#J##"
var index = 0
class Tree<T> {
var data : T
var lchild:Tree<T>? , rchild:Tree<T>?
init(data:T) {
self.data = data
}
static func create() -> Tree<Character>? {
let ch = str[str.index(str.startIndex, offsetBy: index)]
index += 1
if ch == "#" {
} else {
let tree = Tree<Character>(data: ch)
tree.lchild = Tree<Character>.create()
tree.rchild = Tree<Character>.create()
return tree
}
return nil
}
func isEmpty() -> Bool {
return false
}
func depth() -> Int {
var i = 0, j = 0
if lchild != nil {
i = lchild!.depth()
}
if rchild != nil {
j = rchild!.depth()
}
return i > j ? i + 1 : j + 1
}
func root() -> T {
return data
}
func Assign(_ e:T) -> Void {
data = e
}
func PreOrderTraverse() -> Void {
print(String(describing: data), terminator:"")
if let a = lchild {
a.PreOrderTraverse()
}
if let a = rchild {
a.PreOrderTraverse()
}
}
func InOrderTraverse() -> Void {
if let a = lchild {
a.InOrderTraverse()
}
print(String(describing: data), terminator:"")
if let a = rchild {
a.InOrderTraverse()
}
}
func PostOrderTraverse() -> Void {
if let a = lchild {
a.PostOrderTraverse()
}
if let a = rchild {
a.PostOrderTraverse()
}
print(String(describing: data), terminator:"")
}
}