From c4e6578b003c3f3d4393048f508aa5d391b20e9e Mon Sep 17 00:00:00 2001 From: kkk <18436010132@163.com> Date: Wed, 26 Jul 2023 21:22:03 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=84=E8=8C=83=E4=BB=A3=E7=A0=81=EF=BC=8C?= =?UTF-8?q?=E8=A1=A5=E5=85=85readme=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app_test/test_rbtree/README.md | 95 +++++++++++ .../app_test/test_rbtree/img/delete5.png | Bin 0 -> 19201 bytes .../app_test/test_rbtree/img/rbtree.png | Bin 0 -> 23992 bytes .../app_test/test_rbtree/img/result.png | Bin 0 -> 5392 bytes .../app_test/test_rbtree/rbtree.c | 152 ++++++++++++++---- .../app_test/test_rbtree/rbtree.h | 56 +++++-- .../app_test/test_rbtree/test_rbtree.c | 59 ++++--- 7 files changed, 293 insertions(+), 69 deletions(-) create mode 100644 APP_Framework/Applications/app_test/test_rbtree/img/delete5.png create mode 100644 APP_Framework/Applications/app_test/test_rbtree/img/rbtree.png create mode 100644 APP_Framework/Applications/app_test/test_rbtree/img/result.png diff --git a/APP_Framework/Applications/app_test/test_rbtree/README.md b/APP_Framework/Applications/app_test/test_rbtree/README.md index e69de29bb..b1e62b189 100644 --- a/APP_Framework/Applications/app_test/test_rbtree/README.md +++ b/APP_Framework/Applications/app_test/test_rbtree/README.md @@ -0,0 +1,95 @@ +# 热身赛一级赛题2:基于cortex-m4-emulator实现红黑树并测试验证 + +## 1. 简介 +基于矽璓模拟器cortex-m4-emulator,实现了红黑树基本数据结构和功能,主要包括查找、删除、插入、左旋、右旋等功能,并编写测试程序在shell终端打印结果 + + +## 2. 数据结构设计说明 +红黑树数据结构如下: +``` c +enum Type {RED,BLACK}; + +struct Node +{ + int data; + struct Node* left; + struct Node* right; + struct Node* parent; + enum Type color; +}; +``` +红黑树的每个节点上都有存储位表示节点的颜色,颜色是红(Red)或黑(Black)。 +红黑树的基本操作是添加、删除和旋转。在对红黑树进行添加或删除后,会用到旋转方法。旋转的目的是让树保持红黑树的特性。 + + +## 3. 测试程序说明 + 测试程序示例如下: + ```c + void TestRbtree(void) +{ + struct Node* RBT = NULL; //创建红黑树根节点 + + RBT = RbInsert(RBT,2); //插入节点 + RBT = RbInsert(RBT,1); + RBT = RbInsert(RBT,4); + RBT = RbInsert(RBT,5); + RBT = RbInsert(RBT,9); + RBT = RbInsert(RBT,3); + RBT = RbInsert(RBT,6); + RBT = RbInsert(RBT,7); + + printf("\nPreOrder - "); + PreOrder(RBT); //先序遍历 + + printf("\nLevel order - "); + LevelOrder(RBT); //层序遍历 + + struct Node* x = BstSearch(RBT,5); //查找 + RBT = RbDelete(RBT,x); //删除 + + + printf("\nAfter deleting 5"); + + printf("\nPreOrder - "); + PreOrder(RBT); + + front = NULL; rear = NULL; // Delete old Queue + + printf("\nLevel order - "); + LevelOrder(RBT); + +} + +PRIV_SHELL_CMD_FUNCTION(TestRbtree, a red black sample , PRIV_SHELL_CMD_MAIN_ATTR); //注册TestRbtree指令 + ``` +测试程序通过shell指令`TestRbtree`运行,之后输出红黑树插入系列节点后的先序遍历和层序遍历结果,之后删除查找到的节点,并观察结果是否正确。测试覆盖红黑树的插入、删除、查找、先序遍历、层序遍历等功能。 + + + + +## 4. 运行结果 + +运行系统`qemu-system-arm -machine netduinoplus2 -nographic -kernel build/XiZi-cortex-m4-emulator.elf`,之后通过`TestRbtree`指令运行测试程序,执行结果如下: + + ![执行结果](./img/result.png) + + 结果分析如下所示: + ### 1. 插入节点、层序遍历、先序遍历功能测试 + 1. 通过调用`RbInsert(RBT,val)`方法插入数据,初始数据为(2,1,4,5,9,3,6,7),其对应红黑树为: + ![初始生成的红黑树](img/rbtree.png) + 2. 首先调用`PreOrder`函数查看先序遍历结果为: + PreOrder - 2 1 5 4 3 7 6 9 + 与预期一致 + 3. 再调用`LevelOrder`方法,查看层级遍历结果为: + Level order - 2 1 5 4 7 3 6 9 + 与预期结果一致 + 由层序遍历和先序遍历结果,可以看出生成的红黑树和预期一致,插入操作正确。 + ### 2. 删除节点,查找节点功能测试 + 1. 首先通过`struct Node* x = BstSearch(RBT,5);`找到5对应的节点 + 2. 之后使用`RBT = RbDelete(RBT,x);`删除该节点,此时红黑树删除变化为: + ![删除元素5](img/delete5.png) + 3. 同测试1步骤2和3,我们通过`PreOrder`和`LevelOrder`查看此时的树为: + PreOrder - 2 1 6 4 3 7 9 + + Level order - 2 1 6 4 7 3 9 + 4. 运行结果与预期一致,红黑树的删除操作正确。 \ No newline at end of file diff --git a/APP_Framework/Applications/app_test/test_rbtree/img/delete5.png b/APP_Framework/Applications/app_test/test_rbtree/img/delete5.png new file mode 100644 index 0000000000000000000000000000000000000000..6c095aa996978ae1a7b45cbfb9a0c1f89419a3c2 GIT binary patch literal 19201 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

{*DiBNyabXDU96XR=s3| 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 literal 0 HcmV?d00001 diff --git a/APP_Framework/Applications/app_test/test_rbtree/img/rbtree.png b/APP_Framework/Applications/app_test/test_rbtree/img/rbtree.png new file mode 100644 index 0000000000000000000000000000000000000000..25d884bcd497e683b16793287b320d8602024fb1 GIT binary patch literal 23992 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 Km=&5_3H=XldMJtj literal 0 HcmV?d00001 diff --git a/APP_Framework/Applications/app_test/test_rbtree/img/result.png b/APP_Framework/Applications/app_test/test_rbtree/img/result.png new file mode 100644 index 0000000000000000000000000000000000000000..b4e7d176fa0dcea1a570f8484dd51bfbc2285738 GIT binary patch literal 5392 zcmcJTcTf}Fmd7K41Q4Z!jua`OC|!y~P^5(tL{W-VBT|$m3PGA;KtgZQ35Xy?>C!`x z&_SdLK}s-GF@z)_AT2KM_jcdz&hE~e+1dT$wz>DrIWzZu@BQ3^x&bp{XBA`x008Vz zWBr=|zzN84zZQ7vxSsFx7d&oG_}?_r15|zyUOOHzx?MBB1_0C~vK_iG9gkUjjcxq_ z0Iny0D<=pKL=gZ0s2Hk$%?ja2&eP5oF5@z!oUaU=`__f1t!E6{TpmoFNArr=s`QR( z2#t*WyrXyZ6vtI+X^2|8UtHzD5~sd!>7C+z-9Jb3PGLrF$mz3 z%2fp5x$AQ(05Aw3o&cnuz?}qKIEiEi*qr)5T1ez4h9ZIwfA0=2iuP7%?6ur3Kwv_7 z2?z7Ny?Cc^5nXI3h!7lpctqY+1&8VAuux7Y<#bvg^0A4ml)*)^Y-}xu8b0@x?B=7> z>r<`*j`1{2Qe+_c64NdKr=9zGO6Sk4#V2%BY9c~+b$5}(OvH*0_%*1=C!WNeG-4p0 zi|0(W`t_t-m690NRVNzzXOC`x@R1fI(waw_rVhm+zLI?0XnCNKJ^x`_QpK?^_k9&5 zBg=?2w!ifhi2g2>| zer}I_cJOC!lHlVKk%GwI%vtxV^$6IXz7&HkRbr>N7{ktldlf5ng@5qvc4ZrnTP((n zcWJftVAA8>3%ku!UV!kO)SjPru`hghVHx{`G@-HkOVHO^K>|{v*@df+#J+jUv4|~w zzM#GoTxKj+sIqHUE#xcA3{lZD_ zK?7ulMd`17lLa9YyvzZYg@DA@9`nU#j&M|LW#p`Iy{obh`9*h~a zY}z4J{K=8zC1eKHapOJq*neXe^K9~9KJ}&?%16fG?fS!VYFcP^VhRjs72;r!PO6gn za{5m<&F0y1y>Zd<-I-9qOkavH^Oev2k*kAVYUd+aKYR_i~OXi>h8wx=XZSth|t#XgeG^%nB#r* z

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 literal 0 HcmV?d00001 diff --git a/APP_Framework/Applications/app_test/test_rbtree/rbtree.c b/APP_Framework/Applications/app_test/test_rbtree/rbtree.c index 8d4b7e665..d65d4a6b3 100644 --- a/APP_Framework/Applications/app_test/test_rbtree/rbtree.c +++ b/APP_Framework/Applications/app_test/test_rbtree/rbtree.c @@ -1,3 +1,22 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** + * @file rbtree.c + * @author 好果汁有限公司 + * @brief 红黑树功能实现文件,包括插入,删除,左旋,右旋,查找,先序遍历,层序遍历等功能 + * @version 0.1 + * @date 2023-07-26 + */ #include "rbtree.h" #include #include @@ -5,14 +24,14 @@ struct Queue* front = NULL; struct Queue* rear = NULL; -struct Node* pfront() +struct Node* PFront() { struct Node* data ; data = front->data; return data; } -int isempty() +int IsEmpty() { if(front==NULL) return 1; @@ -21,9 +40,9 @@ int isempty() return 0; } -void dequeue() +void DeQueue() { - if(isempty()) + if(IsEmpty()) return ; struct Queue* temp = front; @@ -32,7 +51,7 @@ void dequeue() } -void enqueue(struct Node* data) +void EnQueue(struct Node* data) { struct Queue* temp =(struct Queue*)malloc(sizeof(struct Queue)); temp->data = data; @@ -48,28 +67,39 @@ void enqueue(struct Node* data) rear = temp; } -void levelorder(struct Node* root) +/** + * @brief 层级遍历 + * + * @param root + */ +void LevelOrder(struct Node* root) { if(root==NULL) return; - enqueue(root); + EnQueue(root); - while(!isempty()) + while(!IsEmpty()) { - struct Node* current = pfront(); + struct Node* current = PFront(); printf("%d ",current->data); if(current->left!=NULL) - enqueue(current->left); + EnQueue(current->left); if(current->right!=NULL) - enqueue(current->right); + EnQueue(current->right); - dequeue(); + DeQueue(); } } +/** + * @brief 对x节点左旋 + * + * @param T + * @param x + */ void LeftRotate(struct Node** T,struct Node** x) { struct Node* y = (*x)->right; @@ -94,6 +124,13 @@ void LeftRotate(struct Node** T,struct Node** x) (*x)->parent = y; } + +/** + * @brief 对x节点右旋 + * + * @param T + * @param x + */ void RightRotate(struct Node** T,struct Node** x) { struct Node* y = (*x)->left; @@ -118,7 +155,13 @@ void RightRotate(struct Node** T,struct Node** x) } -void RB_insert_fixup(struct Node** T, struct Node** z) +/** + * @brief 插入节点z后调整红黑树 + * + * @param T + * @param z + */ +void RbInsertFixup(struct Node** T, struct Node** z) { struct Node* grandparent = NULL; struct Node* parentpt = NULL; @@ -188,7 +231,14 @@ void RB_insert_fixup(struct Node** T, struct Node** z) } -struct Node* RB_insert(struct Node* T,int data) +/** + * @brief 插入数据data + * + * @param T + * @param data + * @return struct Node* + */ +struct Node* RbInsert(struct Node* T,int data) { struct Node* z = (struct Node*)malloc(sizeof(struct Node)); z->data = data; @@ -220,22 +270,33 @@ struct Node* RB_insert(struct Node* T,int data) else y->right = z; - RB_insert_fixup(&T,&z); + RbInsertFixup(&T,&z); return T; } -void preorder(struct Node* root) +/** + * @brief 先序遍历 + * + * @param root + */ +void PreOrder(struct Node* root) { if(root==NULL) return; printf("%d ",root->data); - preorder(root->left); - preorder(root->right); + PreOrder(root->left); + PreOrder(root->right); } -struct Node* Tree_minimum(struct Node* node) +/** + * @brief 查找node的开始的最小值 + * + * @param node + * @return struct Node* + */ +struct Node* TreeMinimum(struct Node* node) { while(node->left!=NULL) node = node->left; @@ -243,7 +304,13 @@ struct Node* Tree_minimum(struct Node* node) return node; } -void RB_delete_fixup(struct Node** T, struct Node** x) +/** + * @brief 删除节点x后修正红黑树 + * + * @param T + * @param x + */ +void RbDeleteFixup(struct Node** T, struct Node** x) { while((*x)!=*T && (*x)->color == BLACK) { @@ -323,7 +390,14 @@ void RB_delete_fixup(struct Node** T, struct Node** x) } -void RB_transplat(struct Node** T, struct Node** u,struct Node** v) +/** + * @brief 删除节点u,并用v代替u的位置 + * + * @param T + * @param u + * @param v + */ +void RbTransplat(struct Node** T, struct Node** u,struct Node** v) { if((*u)->parent == NULL) *T = *v; @@ -337,10 +411,17 @@ void RB_transplat(struct Node** T, struct Node** u,struct Node** v) (*v)->parent = (*u)->parent; } -struct Node* RB_delete(struct Node *T,struct Node* z) +/** + * @brief 删除节点z + * + * @param T + * @param z + * @return struct Node* + */ +struct Node* RbDelete(struct Node *T,struct Node* z) { struct Node *y = z; - enum type yoc; + enum Type yoc; yoc = z->color; // y's original color struct Node* x; @@ -348,18 +429,18 @@ struct Node* RB_delete(struct Node *T,struct Node* z) if(z->left==NULL ) { x = z->right; - RB_transplat(&T,&z,&(z->right)); + RbTransplat(&T,&z,&(z->right)); } else if(z->right==NULL ) { x = z->left; - RB_transplat(&T,&z,&(z->left)); + RbTransplat(&T,&z,&(z->left)); } else { - y = Tree_minimum(z->right); + y = TreeMinimum(z->right); yoc = y->color; x = y->right; @@ -368,30 +449,37 @@ struct Node* RB_delete(struct Node *T,struct Node* z) else { - RB_transplat(&T,&y,&(y->right)); + RbTransplat(&T,&y,&(y->right)); y->right = z->right; y->right->parent = y; } - RB_transplat(&T,&z,&y); + RbTransplat(&T,&z,&y); y->left = z->left; y->left->parent = y; y->color = z->color; } if(yoc==BLACK) - RB_delete_fixup(&T,&x); + RbDeleteFixup(&T,&x); return T; } -struct Node* BST_search(struct Node* root, int x) +/** + * @brief 查找x对应的节点 + * + * @param root + * @param x + * @return struct Node* + */ +struct Node* BstSearch(struct Node* root, int x) { if(root==NULL || root->data == x) return root; if(root->data > x) - return BST_search(root->left,x); + return BstSearch(root->left,x); else - return BST_search(root->right,x); + return BstSearch(root->right,x); } \ No newline at end of file diff --git a/APP_Framework/Applications/app_test/test_rbtree/rbtree.h b/APP_Framework/Applications/app_test/test_rbtree/rbtree.h index 68137bb82..f64e3d934 100644 --- a/APP_Framework/Applications/app_test/test_rbtree/rbtree.h +++ b/APP_Framework/Applications/app_test/test_rbtree/rbtree.h @@ -1,5 +1,26 @@ -#ifndef __LIST_H__ -#define __LIST_H__ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** + * @file rbtree.h + * @author 好果汁有限公司 + * @brief 红黑树数据结构和功能函数定义与声明 + * @version 0.1 + * @date 2023-07-26 + */ + + +#ifndef __RBTREE_H__ +#define __RBTREE_H__ #include #include @@ -10,7 +31,7 @@ extern "C" { #endif -enum type {RED,BLACK}; +enum Type {RED,BLACK}; struct Node { @@ -18,7 +39,7 @@ struct Node struct Node* left; struct Node* right; struct Node* parent; - enum type color; + enum Type color; }; struct Queue @@ -29,34 +50,35 @@ struct Queue -struct Node *pfront(); -int isempty(); +struct Node *PFront(); -void dequeue(); +int IsEmpty(); -void enqueue(struct Node *data); +void DeQueue(); -void levelorder(struct Node *root); +void EnQueue(struct Node *data); + +void LevelOrder(struct Node *root); void LeftRotate(struct Node **T, struct Node **x); void RightRotate(struct Node **T, struct Node **x); -void RB_insert_fixup(struct Node **T, struct Node **z); +void RbInsertFixup(struct Node **T, struct Node **z); -struct Node *RB_insert(struct Node *T, int data); +struct Node *RbInsert(struct Node *T, int data); -void preorder(struct Node *root); +void PreOrder(struct Node *root); -struct Node *Tree_minimum(struct Node *node); +struct Node *TreeMinimum(struct Node *node); -void RB_delete_fixup(struct Node **T, struct Node **x); +void RbDeleteFixup(struct Node **T, struct Node **x); -void RB_transplat(struct Node **T, struct Node **u, struct Node **v); +void RbTransplat(struct Node **T, struct Node **u, struct Node **v); -struct Node *RB_delete(struct Node *T, struct Node *z); +struct Node *RbDelete(struct Node *T, struct Node *z); -struct Node *BST_search(struct Node *root, int x); +struct Node *BstSearch(struct Node *root, int x); #ifdef __cplusplus } diff --git a/APP_Framework/Applications/app_test/test_rbtree/test_rbtree.c b/APP_Framework/Applications/app_test/test_rbtree/test_rbtree.c index 13ddd6950..ae7006886 100644 --- a/APP_Framework/Applications/app_test/test_rbtree/test_rbtree.c +++ b/APP_Framework/Applications/app_test/test_rbtree/test_rbtree.c @@ -1,3 +1,22 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** + * @file test_rbtree.c + * @author 好果汁有限公司 + * @brief 红黑树测试文件 + * @version 0.1 + * @date 2023-07-26 + */ #include #include #include @@ -8,40 +27,40 @@ extern struct Queue* front; extern struct Queue* rear; -void Test_Rbtree(void) +void TestRbtree(void) { struct Node* RBT = NULL; - RBT = RB_insert(RBT,2); - RBT = RB_insert(RBT,1); - RBT = RB_insert(RBT,4); - RBT = RB_insert(RBT,5); - RBT = RB_insert(RBT,9); - RBT = RB_insert(RBT,3); - RBT = RB_insert(RBT,6); - RBT = RB_insert(RBT,7); + RBT = RbInsert(RBT,2); + RBT = RbInsert(RBT,1); + RBT = RbInsert(RBT,4); + RBT = RbInsert(RBT,5); + RBT = RbInsert(RBT,9); + RBT = RbInsert(RBT,3); + RBT = RbInsert(RBT,6); + RBT = RbInsert(RBT,7); - printf("\nPreorder - "); - preorder(RBT); + printf("\nPreOrder - "); + PreOrder(RBT); printf("\nLevel order - "); - levelorder(RBT); + LevelOrder(RBT); - struct Node* x = BST_search(RBT,5); - - RBT = RB_delete(RBT,x); + struct Node* x = BstSearch(RBT,5); + RBT = RbDelete(RBT,x); + printf("\nAfter deleting 5"); - printf("\nPreorder - "); - preorder(RBT); + printf("\nPreOrder - "); + PreOrder(RBT); front = NULL; rear = NULL; // Delete old Queue printf("\nLevel order - "); - levelorder(RBT); + LevelOrder(RBT); - return ; + // return ; } -PRIV_SHELL_CMD_FUNCTION(Test_Rbtree, a red black sample , PRIV_SHELL_CMD_MAIN_ATTR); +PRIV_SHELL_CMD_FUNCTION(TestRbtree, a red black sample , PRIV_SHELL_CMD_MAIN_ATTR);