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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

数据结构 树

發布時間:2023/12/13 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构 树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

定義

  • 樹是節點的優先集合

  • 度:孩子的數量,度為0 就是終端節點,不為零就是根節點
  • 有序樹:有順序,不可以替換
  • 無序樹:無順序,可以替換

  • 深度 和 樹的深度相反,第一層深度為1?
  • 樹的深度為 3

二叉樹

?

  • 滿二叉樹每一層的節點達到最大
  • 完全二叉樹? 從頭部開始,從左往右依次讀數,存在的數據和滿二叉樹的位置一一對應就是完全二叉樹
  • 滿二叉樹是完全二叉樹
  • 完全二叉樹不是滿二叉樹

二叉樹的存儲結構

順序存儲

鏈式存儲

代碼

數組二叉樹

/************************************************************************/ /* 樹課程要求:完成樹的基本操作1. 樹的創建和銷毀2. 樹中節點的搜索3. 樹中節點的添加與刪除4. 樹中節點的遍歷BOOL CreateTree(Tree **pTree, Node *pRoot); //創建樹void DestroyTree(Tree *pTree); //銷毀樹Node *SearchNode(Tree *pTree, int nodeIndex); //根據索引尋找節點BOOL AddNode(Tree *pTree, int nodeIndex, int direction, Node *pNode); //添加節點BOOL DeleteNode(Tree *pTree, int nodeIndex, Node *pNode); //刪除節點void PreorderTraversal(Tree *pTree); //前(先)序遍歷演示void InorderTraversal(Tree *pTree); //中序遍歷演示void PostorderTraversal(Tree *pTree); //后序遍歷演示void TreeTraverse(Tree *pTree); //遍歷七日成蝶-叩開數據結構之門(鏈表)關于數組與樹之間的算法轉換int 3 5 8 2 6 9 7 父親結點下標*2+1 該結點左 父親結點下標*2+2 該結點右3(0)5(1) 8(2)2(3) 6(4) 9(5) 7(6) */ /************************************************************************/#include <stdio.h> #include <stdlib.h>#define MAX_NODE 20 #define LEFT 1 #define RIGHT 2 #define FALSE 0 #define TRUE 1 #define BOOL inttypedef struct tag_node {int data; }Node;typedef struct tag_tree {Node *root; }Tree;BOOL CreateTree(Tree **pTree, Node *pRoot) {*pTree = (Tree *)malloc(sizeof(Tree));if(*pTree == NULL){return FALSE;}(*pTree)->root = (Node *)malloc(sizeof(Node) * MAX_NODE);if((*pTree)->root == NULL){free(*pTree);return FALSE;}for(int i = 0; i < MAX_NODE; i++){(*pTree)->root[i].data = 0;}(*pTree)->root[0] = *pRoot; //(*pTree)->root[0].data = pRoot->data;return TRUE; }void DestroyTree(Tree *pTree) {free(pTree->root);pTree->root = NULL;free(pTree);pTree = NULL; }Node *SearchNode(Tree *pTree, int nodeIndex) {if(nodeIndex < 0 || nodeIndex >= MAX_NODE){return NULL;}if(pTree->root[nodeIndex].data == 0){return NULL;}else{return &(pTree->root[nodeIndex]);} }//BOOL SearchNode(Tree *pTree, int nodeIndex, Node *node) //{ // if(nodeIndex < 0 || nodeIndex >= MAX_NODE) // { // return FALSE; // } // // if(pTree->root[nodeIndex].data == 0) // { // return FALSE; // } // else // { // node->data = pTree->root[nodeIndex].data; //*node = pTree->root[nodeIndex]; // // // return TRUE; // } //}BOOL AddNode(Tree *pTree, int nodeIndex, int direction, Node *pNode) {if(nodeIndex < 0 || nodeIndex >= MAX_NODE){return FALSE;}if(pTree->root[nodeIndex].data == 0){return FALSE;}pTree->root[nodeIndex * 2 + direction].data = pNode->data; //pTree->root[nodeIndex * 2 + direction] = *pNode;return TRUE; }BOOL DeleteNode(Tree *pTree, int nodeIndex, Node *pNode) {if(nodeIndex < 0 || nodeIndex >= MAX_NODE){return FALSE;}if(pTree->root[nodeIndex].data == 0){return FALSE;}*pNode = pTree->root[nodeIndex];pTree->root[nodeIndex].data = 0;return TRUE; }void TreeTraverse(Tree *pTree) {for(int i = 0; i < MAX_NODE; i++){printf("%d ", pTree->root[i].data);} }int main(void) {Tree *pTree = NULL;Node node = {3};Node node1 = {5};Node node2 = {8};Node node3 = {2};Node node4 = {6};Node node5 = {9};Node node6 = {7};CreateTree(&pTree, &node);AddNode(pTree, 0, LEFT, &node1);AddNode(pTree, 0, RIGHT, &node2);AddNode(pTree, 1, LEFT, &node3);AddNode(pTree, 1, RIGHT, &node4);AddNode(pTree, 2, LEFT, &node5);AddNode(pTree, 2, RIGHT, &node6);TreeTraverse(pTree);DestroyTree(pTree);system("pause");return 0; }

鏈表 二叉樹

/************************************************************************/ /* 樹課程要求:完成樹的基本操作1. 樹的創建和銷毀2. 樹中節點的搜索3. 樹中節點的添加與刪除4. 樹中節點的遍歷BOOL CreateTree(Tree **pTree, Node *pRoot); //創建樹void DestroyTree(Tree *pTree); //銷毀樹Node *SearchNode(Tree *pTree, int nodeIndex); //根據索引尋找節點BOOL AddNode(Tree *pTree, int nodeIndex, int direction, Node *pNode); //添加節點BOOL DeleteNode(Tree *pTree, int nodeIndex, Node *pNode); //刪除節點void PreorderTraversal(Tree *pTree); //前(先)序遍歷演示void InorderTraversal(Tree *pTree); //中序遍歷演示void PostorderTraversal(Tree *pTree); //后序遍歷演示七日成蝶-叩開數據結構之門(鏈表)七日成蝶-C語言編程基礎3 5 8 2 6 9 7 前序遍歷:3 5 2 6 8 9 7 中序遍歷:2 5 6 3 9 8 7后序遍歷:2 6 5 9 7 8 33(0)5(1) 8(2)2(3) 6(4) 9(5) 7(6) */ /************************************************************************/#include <stdio.h> #include <stdlib.h>//#define MAX_NODE 20 #define LEFT 1 #define RIGHT 2 #define FALSE 0 #define TRUE 1 #define BOOL inttypedef struct tag_node {int index;int data;struct tag_node *pLChild;struct tag_node *pRChild;struct tag_node *pParent; }Node;typedef struct tag_tree {Node *root; }Tree;BOOL CreateTree(Tree **pTree, Node *pRoot); void DestroyTree(Tree *pTree); void DeleteNodeEx(Node *pNode, int direction); Node *SearchNode(Tree *pTree, int nodeIndex); Node *SearchNodeEx(Node *pNode, int nodeIndex); BOOL AddNode(Tree *pTree, int nodeIndex, int direction, Node *pNode); BOOL DeleteNode(Tree *pTree, int nodeIndex, Node *pNode); void PreorderTraversal(Tree *pTree); void PreorderTraversalNode(Node *pNode); void InorderTraversal(Tree *pTree); void InorderTraversalNode(Node *pNode); void PostorderTraversal(Tree *pTree); void PostorderTraversalNode(Node *pNode);BOOL CreateTree(Tree **pTree, Node *pRoot) {*pTree = (Tree *)malloc(sizeof(Tree));if(*pTree == NULL){return FALSE;}(*pTree)->root = (Node *)malloc(sizeof(Node));if((*pTree)->root == NULL){free(*pTree);return FALSE;}*((*pTree)->root) = *pRoot; /*(*pTree)->root->data = pRoot->data;(*pTree)->root->index = pRoot->index;(*pTree)->root->pLChild = NULL;(*pTree)->root->pRChild = NULL;(*pTree)->root->pParent = NULL;*/return TRUE; }void DestroyTree(Tree *pTree) {DeleteNodeEx(pTree->root->pLChild, LEFT);DeleteNodeEx(pTree->root->pRChild, RIGHT);free(pTree->root);pTree->root = NULL;free(pTree);pTree = NULL; }void DeleteNodeEx(Node *pNode, int direction) {if(pNode != NULL){DeleteNodeEx(pNode->pLChild, LEFT);DeleteNodeEx(pNode->pRChild, RIGHT);if(direction == LEFT){pNode->pParent->pLChild = NULL;}if(direction == RIGHT){pNode->pParent->pRChild = NULL;}free(pNode);pNode = NULL;}}Node *SearchNode(Tree *pTree, int nodeIndex) {return SearchNodeEx(pTree->root, nodeIndex); }Node *SearchNodeEx(Node *pNode, int nodeIndex) {if(pNode == NULL){return NULL;}if(pNode->index == nodeIndex){return pNode;}else{Node *temp = NULL;temp = SearchNodeEx(pNode->pLChild, nodeIndex);if(temp != NULL){return temp;}temp = SearchNodeEx(pNode->pRChild, nodeIndex);return temp;} }//BOOL SearchNode(Tree *pTree, int nodeIndex, Node *node) //{ // if(nodeIndex < 0 || nodeIndex >= MAX_NODE) // { // return FALSE; // } // // if(pTree->root[nodeIndex].data == 0) // { // return FALSE; // } // else // { // node->data = pTree->root[nodeIndex].data; //*node = pTree->root[nodeIndex]; // // // return TRUE; // } //}BOOL AddNode(Tree *pTree, int nodeIndex, int direction, Node *pNode) {Node *temp = SearchNode(pTree, nodeIndex);Node *newNode = NULL;if(temp == NULL){return FALSE;}if(direction == LEFT){if(temp->pLChild == NULL){newNode = (Node *)malloc(sizeof(Node));if(newNode == NULL){return FALSE;}*newNode = *pNode;temp->pLChild = newNode;newNode->pParent = temp;}else{return FALSE;}}else{if(temp->pRChild == NULL){newNode = (Node *)malloc(sizeof(Node));if(newNode == NULL){return FALSE;}*newNode = *pNode;temp->pRChild = newNode;newNode->pParent = temp;}else{return FALSE;}}return TRUE; }BOOL DeleteNode(Tree *pTree, int nodeIndex, Node *pNode) {Node *temp = SearchNode(pTree, nodeIndex);if(temp == NULL){return FALSE;}*pNode = *temp;DeleteNodeEx(temp->pLChild, LEFT);DeleteNodeEx(temp->pRChild, RIGHT);if(temp->pParent->pLChild == temp){temp->pParent->pLChild = NULL;}if(temp->pParent->pRChild == temp){temp->pParent->pRChild = NULL;}free(temp);temp = NULL;return TRUE; }//void TreeTraverse(Tree *pTree) //{ // for(int i = 0; i < MAX_NODE; i++) // { // printf("%d ", pTree->root[i].data); // } //}void PreorderTraversal(Tree *pTree) {PreorderTraversalNode(pTree->root); }void PreorderTraversalNode(Node *pNode) {if(pNode != NULL){printf("%d ", pNode->data);PreorderTraversalNode(pNode->pLChild);PreorderTraversalNode(pNode->pRChild);} }void InorderTraversal(Tree *pTree) {InorderTraversalNode(pTree->root); }void InorderTraversalNode(Node *pNode) {if(pNode != NULL){InorderTraversalNode(pNode->pLChild);printf("%d ", pNode->data);InorderTraversalNode(pNode->pRChild);} }void PostorderTraversal(Tree *pTree) {PostorderTraversalNode(pTree->root); }void PostorderTraversalNode(Node *pNode) {if(pNode != NULL){PostorderTraversalNode(pNode->pLChild);PostorderTraversalNode(pNode->pRChild);printf("%d ", pNode->data);} }int main(void) {Tree *pTree = NULL;Node node = {0, 3, NULL, NULL, NULL};Node node1 = {1, 5, NULL, NULL, NULL};Node node2 = {2, 8, NULL, NULL, NULL};Node node3 = {3, 2, NULL, NULL, NULL};Node node4 = {4, 6, NULL, NULL, NULL};Node node5 = {5, 9, NULL, NULL, NULL};Node node6 = {6, 7, NULL, NULL, NULL};CreateTree(&pTree, &node);AddNode(pTree, 0, LEFT, &node1);AddNode(pTree, 0, RIGHT, &node2);AddNode(pTree, 1, LEFT, &node3);AddNode(pTree, 1, RIGHT, &node4);AddNode(pTree, 2, LEFT, &node5);AddNode(pTree, 2, RIGHT, &node6);//PreorderTraversal(pTree);//InorderTraversal(pTree);PostorderTraversal(pTree);DestroyTree(pTree);system("pause");return 0; }

?

總結

以上是生活随笔為你收集整理的数据结构 树的全部內容,希望文章能夠幫你解決所遇到的問題。

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