生活随笔
收集整理的這篇文章主要介紹了
大话数据结构13:二叉树 数组存储
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
基礎介紹
對于完全二叉樹 父節點位置與子節點位置 i 與 2*i +1
前序遍歷
打印函數在前
中序遍歷
打印函數在中
后序遍歷
打印函數在后
#include "stdio.h"
#include "stdlib.h"
#include "io.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 TElemType
;
typedef TElemType SqBiTree
[MAX_TREE_SIZE
]; typedef struct
{int level
;int order
;
}Position
;TElemType Nil
= 0; Status
visit(TElemType c
)
{printf("%d", c
);return OK
;
}
Status
InitBiTree(SqBiTree T
)
{int i
;for (int i
= 0; i
< MAX_TREE_SIZE
; i
++){T
[i
] = Nil
;}return OK
;
}
Status
CreateBiTree(SqBiTree T
)
{int i
= 0;printf("請按層序輸入結點的值(整型),0表示空結點,輸999結束。結點數≤%d:\n", MAX_TREE_SIZE
);while (i
< 10){T
[i
] = i
+ 1;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
;elsereturn FALSE
;
}
int BiTreeDepth(SqBiTree T
)
{int i
;int j
= -1;for (i
= MAX_TREE_SIZE
- 1; i
>= 0; i
--){if (T
[i
] != Nil
)break;}do{j
++;} while (i
>= powl(2, j
));return j
;
}
Status
Root(SqBiTree T
, TElemType
* e
)
{if (BiTreeEmpty(T
))return ERROR
;else{*e
= T
[0];return OK
;}
}
TElemType
Value(SqBiTree T
, Position e
)
{return T
[(int)powl(2, e
.level
- 1) + e
.order
- 2];
}
Status
Assign(SqBiTree T
, Position e
, TElemType value
)
{int i
= (int)powl(2, e
.level
- 1) + e
.order
- 2; if (value
!= Nil
&& T
[(i
+ 1) / 2 - 1] == Nil
) return ERROR
;else if (value
== Nil
&& (T
[i
* 2 + 1] != Nil
|| T
[i
* 2 + 2] != Nil
)) return ERROR
;T
[i
] = value
;return OK
;
}
TElemType
Parent(SqBiTree T
, TElemType e
)
{int i
;if (T
[0] == Nil
)return Nil
;for (i
= 1; i
<= MAX_TREE_SIZE
- 1; i
++)if (T
[i
] == e
) return T
[(i
+ 1) / 2 - 1];return Nil
; }
TElemType
LeftChild(SqBiTree T
, TElemType e
)
{int i
;if (T
[0] == Nil
){return Nil
;}for (int i
= 0; i
<= MAX_TREE_SIZE
; i
++){if (T
[i
] == e
)return T
[i
* 2 + 1];return Nil
;}
}
TElemType
RightChild(SqBiTree T
, TElemType e
)
{int i
;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
;}
}
TElemType
LeftSibling(SqBiTree T
, TElemType e
)
{int i
;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
;
}
TElemType
RightSibling(SqBiTree T
, TElemType e
)
{int i
;if (T
[0] == Nil
) return Nil
;for (int i
= 1; i
<= MAX_TREE_SIZE
; i
++){if (T
[i
] == e
&& i
% 2 == 1)return T
[i
+ 1];}return Nil
;
}
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
;
}
Status
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
]);return OK
;
}
Status
PostOrderTraverse(SqBiTree T
)
{if (!BiTreeEmpty(T
)) PostTraverse(T
, 0);printf("\n");return OK
;
}
void LevelOrderTraverse(SqBiTree T
)
{int i
= MAX_TREE_SIZE
- 1;int j
;while (T
[i
] == Nil
){i
--;}for (int j
= 0; j
<= i
; j
++){if (T
[j
] != Nil
){visit(T
[j
]);}}printf("\n");
}
void Print(SqBiTree T
)
{int j
;int k
;Position p
;TElemType e
;for (int j
= 1; j
<= BiTreeDepth(T
); j
++){printf("第%d層: ", j
);for (int k
= 1; k
<= powl(2, j
- 1); k
++){p
.level
= j
;p
.order
= k
;e
= Value(T
, p
);if (e
!= Nil
)printf("%d:%d", k
, e
);}printf("\n");}
}int main()
{Status i
;Position p
;TElemType e
;SqBiTree T
;InitBiTree(T
);CreateBiTree(T
);printf("建立二叉樹后,樹空否?%d(1:是 0:否) 樹的深度=%d\n", BiTreeEmpty(T
), BiTreeDepth(T
));i
= Root(T
, &e
);if (i
)printf("二叉樹的根為:%d\n", e
);elseprintf("樹空,無根\n");printf("層序遍歷二叉樹:\n");Print(T
);printf("前序遍歷二叉樹:\n");PreOrderTraverse(T
);printf("中序遍歷二叉樹:\n");InOrderTraverse(T
);printf("后序遍歷二叉樹:\n");PostOrderTraverse(T
);printf("修改結點的層號3本層序號2。");p
.level
= 3;p
.order
= 2;e
= Value(T
, p
);printf("待修改結點的原值為%d請輸入新值:50 ", e
);e
= 50;Assign(T
, p
, e
);printf("前序遍歷二叉樹:\n");PreOrderTraverse(T
);printf("結點%d的雙親為%d,左右孩子分別為", e
, Parent(T
, e
));printf("%d,%d,左右兄弟分別為", LeftChild(T
, e
), RightChild(T
, e
));printf("%d,%d\n", LeftSibling(T
, e
), RightSibling(T
, e
));ClearBiTree(T
);printf("清除二叉樹后,樹空否?%d(1:是 0:否) 樹的深度=%d\n", BiTreeEmpty(T
), BiTreeDepth(T
));i
= Root(T
, &e
);if (i
)printf("二叉樹的根為:%d\n", e
);elseprintf("樹空,無根\n");return 0;}```
總結
以上是生活随笔為你收集整理的大话数据结构13:二叉树 数组存储的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。