日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

大话数据结构13:二叉树 数组存储

發布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大话数据结构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; /* Status是函數的類型,其值是函數結果狀態代碼,如OK等*/typedef int TElemType; /* 樹結點的數據類型,目前暫定為整型 */ typedef TElemType SqBiTree[MAX_TREE_SIZE]; /* 0號單元存儲根結點 */typedef struct {int level;int order; /* 結點的層,本層序號(按滿二叉樹計算) */ }Position;TElemType Nil = 0; /* 設整型以0為空 */Status visit(TElemType c) {printf("%d", c);return OK; }/* 構造空二叉樹T。因為T是固定數組,不會改變,故不需要& */ Status InitBiTree(SqBiTree T) {int i;for (int i = 0; i < MAX_TREE_SIZE; i++){T[i] = Nil;}return OK; }/* 按層序次序輸入二叉樹中結點的值(字符型或整型), 構造順序存儲的二叉樹T */ 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; /* 將空賦值給T的后面的結點 */i++;}return OK; }#define ClearBiTree InitBiTree /* 在順序存儲結構中,兩函數完全一樣 *//* 初始條件: 二叉樹T存在 */ /* 操作結果: 若T為空二叉樹,則返回TRUE,否則FALSE */ Status BiTreeEmpty(SqBiTree T) {if (T[0] == Nil) /* 根結點為空,則樹空 */return TRUE;elsereturn FALSE; }/* 初始條件: 二叉樹T存在。操作結果: 返回T的深度 */ 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));/* 計算2的j次冪。 */return j; }/* 初始條件: 二叉樹T存在 */ /* 操作結果: 當T不空,用e返回T的根,返回OK;否則返回ERROR,e無定義 */ Status Root(SqBiTree T, TElemType* e) {if (BiTreeEmpty(T))return ERROR;else{*e = T[0];return OK;} }/* 初始條件: 二叉樹T存在,e是T中某個結點(的位置) */ /* 操作結果: 返回處于位置e(層,本層序號)的結點的值 */TElemType Value(SqBiTree T, Position e) {return T[(int)powl(2, e.level - 1) + e.order - 2]; }/* 初始條件: 二叉樹T存在,e是T中某個結點(的位置) */ /* 操作結果: 給處于位置e(層,本層序號)的結點賦新值value */ 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; }/* 初始條件: 二叉樹T存在,e是T中某個結點 */ /* 操作結果: 若e是T的非根結點,則返回它的雙親,否則返回"空" */ 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) /* 找到e */return T[(i + 1) / 2 - 1];return Nil; /* 沒找到e */}/* 初始條件: 二叉樹T存在,e是T中某個結點 */ /* 操作結果: 返回e的左孩子。若e無左孩子,則返回"空" */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)/* 找到e */return T[i * 2 + 1];return Nil;/* 沒找到e */} } /* 初始條件: 二叉樹T存在,e是T中某個結點 */ /* 操作結果: 返回e的右孩子。若e無右孩子,則返回"空" */ 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;} }/* 初始條件: 二叉樹T存在,e是T中某個結點 */ /* 操作結果: 返回e的左兄弟。若e是T的左孩子或無左兄弟,則返回"空" */ 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)/* 找到e且其序號為偶數(是右孩子) */return T[i - 1];}return Nil; /* 沒找到e */ }/* 初始條件: 二叉樹T存在,e是T中某個結點 */ /* 操作結果: 返回e的右兄弟。若e是T的右孩子或無右兄弟,則返回"空" */ 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)//找到e,且為左子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); }/* 初始條件: 二叉樹存在 */ /* 操作結果: 先序遍歷T。 */ 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); }/* 初始條件: 二叉樹存在 */ /* 操作結果: 中序遍歷T。 */ 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; }/* 初始條件: 二叉樹T存在 */ /* 操作結果: 后序遍歷T。 */ 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:二叉树 数组存储的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。