日韩性视频-久久久蜜桃-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:二叉树 数组存储的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 台湾佬美性中文 | 丁香婷婷激情五月 | jizz日本大全| 午夜视频在线观看视频 | 亚洲蜜桃在线 | 欧美国产中文字幕 | 精品不卡一区二区 | 男女插插视频 | 91中文字幕在线观看 | 亚洲视频欧洲视频 | 美日韩在线观看 | 久久精品爱 | 日韩欧美一本 | 国产高清成人久久 | 国产精品无码一区二区三 | 国产精品不卡一区 | 欧美在线观看免费高清 | 国产美女无遮挡免费视频 | 天堂在线中文字幕 | 热久久国产精品 | av黄网站| 永久精品视频 | 欧美激情区 | 久久久久久亚洲av无码专区 | 成年人黄网站 | 色婷婷基地 | 欧美性生交大片免费看app麻豆 | 欧美成人精品三级网站 | 色视频在线看 | 天天躁日日躁狠狠躁喷水 | 狠狠躁夜夜躁人人爽视频 | 国产精品一色哟哟哟 | 四虎国产精品永久免费观看视频 | 欧美一级爽aaaaa大片 | 无码人妻丰满熟妇啪啪网站 | 美女黄色小视频 | 欧美另类videos| 成人午夜影院在线观看 | 亚洲精品美女 | 亚洲爽妇网 | 麻豆国产一区二区三区 | 欧美成人一区二区三区片免费 | 艳妇乳肉豪妇荡乳xxx | 国产视频123| 黄色视屏软件 | 国产最新在线视频 | 色涩视频在线观看 | 人人艹在线观看 | 午夜激情免费视频 | 国产精品久久久久久久久免费 | 欧美与黑人午夜性猛交久久久 | 999超碰| 欧美操穴视频 | 亚洲国产日韩在线一区 | 捆绑调教在线观看 | 中国a级黄色片 | 丁香七月婷婷 | fc2ppv色の美マンに中出し | 欧美大片一区二区 | 久久久久久综合网 | 美女自拍偷拍 | 美女洗澡无遮挡 | 日韩午夜小视频 | 日韩欧美99 | 国语对白一区 | 瑟瑟在线视频 | 日韩免费视频观看 | 黄色小说图片视频 | 国产suv精品一区二区三区 | 亚洲精品中文字幕在线播放 | 黄色av观看 | 国产日韩成人 | 亚洲女人毛茸茸 | 理论片久久 | 亚洲精品乱码久久久久 | 一道本在线观看视频 | 亚洲深爱 | 边打电话边做 | 看片地址 | 日本午夜一区二区 | 香蕉久久夜色精品国产使用方法 | 91网站在线免费看 | 五月天丁香 | 激情伊人 | 污污网站免费 | 91视频 - 88av | 国产欧美精品国产国产专区 | 成人国产精品视频 | 草比视频在线观看 | 91丨九色丨丰满 | 毛片无遮挡高清免费观看 | 免费在线观看视频a | 亚洲精品国产精品国自产观看浪潮 | 欧美 日韩 国产 一区二区三区 | 天天夜夜草| 亚洲人在线观看视频 | 91视频在线免费 | 青青在线精品 | 久久久久亚洲av无码专区喷水 |