From 7727e649502a042eeef5a38a587c5b75da1c3e9e Mon Sep 17 00:00:00 2001 From: Kim Yang Date: Sun, 23 Aug 2020 05:20:58 +0800 Subject: [PATCH] :seedling: add ThreadBiTree --- .../DS_2_StackAndQueue/DS_2_6_LiQueue0.cpp | 2 +- .../DS_4_0_BiTreeSq.cpp | 32 ++++ .../DS_4_TreeAndBinaryTree/DS_4_0_STree.cpp | 16 -- .../DS_4_1_BiTreeLink.cpp | 139 ++++++++++++++++++ .../DS_4_TreeAndBinaryTree/DS_4_1_LTree.cpp | 34 ----- .../DS_4_TreeAndBinaryTree/DS_4_2_BiTreeF.cpp | 38 +++++ .../DS_4_3_ThreadedBiTree.cpp | 70 +++++++++ 7 files changed, 280 insertions(+), 51 deletions(-) create mode 100644 DataStructure/DS_4_TreeAndBinaryTree/DS_4_0_BiTreeSq.cpp delete mode 100644 DataStructure/DS_4_TreeAndBinaryTree/DS_4_0_STree.cpp create mode 100644 DataStructure/DS_4_TreeAndBinaryTree/DS_4_1_BiTreeLink.cpp delete mode 100644 DataStructure/DS_4_TreeAndBinaryTree/DS_4_1_LTree.cpp create mode 100644 DataStructure/DS_4_TreeAndBinaryTree/DS_4_2_BiTreeF.cpp create mode 100644 DataStructure/DS_4_TreeAndBinaryTree/DS_4_3_ThreadedBiTree.cpp diff --git a/DataStructure/DS_2_StackAndQueue/DS_2_6_LiQueue0.cpp b/DataStructure/DS_2_StackAndQueue/DS_2_6_LiQueue0.cpp index 10c272a..a156579 100644 --- a/DataStructure/DS_2_StackAndQueue/DS_2_6_LiQueue0.cpp +++ b/DataStructure/DS_2_StackAndQueue/DS_2_6_LiQueue0.cpp @@ -62,7 +62,7 @@ bool GetHead(LinkQueue Q, int &x) { } bool QueueEmpty(LinkQueue Q) { - return Q.front==Q.rear? true: false; + return Q.front == Q.rear ? true : false; } /**实现模块**/ diff --git a/DataStructure/DS_4_TreeAndBinaryTree/DS_4_0_BiTreeSq.cpp b/DataStructure/DS_4_TreeAndBinaryTree/DS_4_0_BiTreeSq.cpp new file mode 100644 index 0000000..c9175de --- /dev/null +++ b/DataStructure/DS_4_TreeAndBinaryTree/DS_4_0_BiTreeSq.cpp @@ -0,0 +1,32 @@ +// +// Created by Kim Yang on 2020/8/14. +// Copyright (c) Kim Yang All rights reserved. +// + +//顺序存储————二叉树 +#include + +/**定义模块**/ +#define MaxSize 100 + +struct TreeNode { + int value;//结点中的数据元素 + bool isEmpty; +}; + +/**定义模块**/ + +/**实现模块**/ +//坐等填坑 + +/**实现模块**/ + +/**测试模块**/ + + +/**测试模块**/ + +int main() { + + return 0; +} \ No newline at end of file diff --git a/DataStructure/DS_4_TreeAndBinaryTree/DS_4_0_STree.cpp b/DataStructure/DS_4_TreeAndBinaryTree/DS_4_0_STree.cpp deleted file mode 100644 index 02ec794..0000000 --- a/DataStructure/DS_4_TreeAndBinaryTree/DS_4_0_STree.cpp +++ /dev/null @@ -1,16 +0,0 @@ -// -// Created by Kim Yang on 2020/8/14. -// Copyright (c) Kim Yang All rights reserved. -// - -//顺序存储 -#include - - -#define MaxSize 100 - -struct TreeNode{ - int value;//结点中的数据元素 - bool isEmpty; -}; - diff --git a/DataStructure/DS_4_TreeAndBinaryTree/DS_4_1_BiTreeLink.cpp b/DataStructure/DS_4_TreeAndBinaryTree/DS_4_1_BiTreeLink.cpp new file mode 100644 index 0000000..1c04ef7 --- /dev/null +++ b/DataStructure/DS_4_TreeAndBinaryTree/DS_4_1_BiTreeLink.cpp @@ -0,0 +1,139 @@ +// +// Created by Kim Yang on 2020/8/14. +// Copyright (c) Kim Yang All rights reserved. +// + +//链式存储————二叉树 +#include +#include + +/***定义模块*/ +struct ElemType { + int value; +}; + +typedef struct BiTNode { + ElemType data;//数据域 + struct BiTNode *lchild, *rchild;//左右孩子指针 +} BiTNode, *BiTree; +/**定义模块**/ + +/**实现模块**/ +//初始化 +void InitTree(BiTree root) { + root = (BiTree) malloc(sizeof(BiTNode)); + root->data = {1}; + root->lchild = NULL; + root->rchild = NULL; +} + +//插入新结点 +bool InsertNode(BiTree T, ElemType val) { + BiTNode *p = (BiTNode *) malloc(sizeof(BiTNode)); + p->data = val; + p->lchild = NULL; + p->rchild = NULL; + T->lchild = p;//作为左孩子 +} + +//访问函数 +void visit(BiTree T) { + printf("%d", T->data.value); +} + +//先序遍历 +void PreOder(BiTree T) { + if (T != NULL) { + visit(T);//访问根节点 + PreOder(T->lchild);//遍历左子树 + PreOder(T->rchild);//遍历右子树 + } +} + +//中序遍历 +void InOrder(BiTree T) { + if (T != NULL) { + InOrder(T->lchild);//遍历左子树 + visit(T);//访问根节点 + InOrder(T->rchild);//遍历右子树 + } +} + +//后序遍历 +void PostOder(BiTree T) { + if (T != NULL) { + PostOder(T->lchild); + PostOder(T->rchild); + visit(T); + } +} + +//用于层序遍历的辅助队列 +typedef struct LinkNode { + BiTNode *data;//存的是指针而非结点 + struct LinkNode *next; +} LinkNode; + +typedef struct { + LinkNode *front, *rear;//队头队尾 +} LinkQueue; + +void InitQueue(LinkQueue &Q) { + Q.front = Q.rear = (LinkNode *) malloc(sizeof(LinkNode)); + //初始化时,front 、rear 都指向头节点 + Q.front->next = NULL; +} + +bool EnQueue(LinkQueue &Q, BiTNode *x) { + //判满?链式存储一般不需要判满,除非内存不足 + LinkNode *s = (LinkNode *) malloc(sizeof(LinkNode)); + if (s == NULL)return false; + s->data = x; + s->next = NULL; + Q.rear->next = s;//新节点插入到rear之后 + Q.rear = s;//修改表尾指针 + return true; +} + +bool DeQueue(LinkQueue &Q, BiTNode *x) { + if (Q.front == Q.rear)return false;//队空 + LinkNode *p = Q.front->next;//用指针p记录队头元素 + x = p->data;//用x变量返回队头元素 + Q.front->next = p->next;//修改头节点的next指针 + if (Q.rear == p)//此次是最后一个节点出队 + Q.rear = Q.front;//修改rear指针,思考一下为什么? + free(p); //释放节点空间 + return true; +} + +bool isEmpty(LinkQueue Q) { + return Q.front == Q.rear ? true : false; +} + +//层序遍历 +void levelOrder(BiTree T) { + LinkQueue Q;//辅助队列 + InitQueue(Q);// + BiTree p; + EnQueue(Q, T); + while (!isEmpty(Q)) { + DeQueue(Q, p);//队头结点出队 + visit(p); + if (p->lchild != NULL) + EnQueue(Q, p->lchild); + if (p->rchild != NULL) + EnQueue(Q, p->rchild); + } +} + +/**实现模块**/ + +/**测试模块**/ + + +/**测试模块**/ + +int main() { + + return 0; +} \ No newline at end of file diff --git a/DataStructure/DS_4_TreeAndBinaryTree/DS_4_1_LTree.cpp b/DataStructure/DS_4_TreeAndBinaryTree/DS_4_1_LTree.cpp deleted file mode 100644 index 984ed77..0000000 --- a/DataStructure/DS_4_TreeAndBinaryTree/DS_4_1_LTree.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// -// Created by Kim Yang on 2020/8/14. -// Copyright (c) Kim Yang All rights reserved. -// - -//链式存储 -#include -#include -#define MaxSize 100 -struct ElemType{ - int value; -}; - -typedef struct BiTNode{ - ElemType data;//数据域 - struct BiTNode *lchild,*rchild;//左右孩子指针 -}BiTNode, *BiTree; - -//初始化 -void InitTree(BiTree root){ - root=(BiTree)malloc(sizeof(BiTNode)); - root->data={1}; - root->lchild=NULL; - root->rchild=NULL; -} - -//插入新结点 -bool InsertNode(BiTree T, ElemType val){ - BiTNode *p=(BiTNode *)malloc(sizeof(BiTNode)); - p->data=val; - p->lchild=NULL; - p->rchild=NULL; - T->lchild=p;//作为左孩子 -} diff --git a/DataStructure/DS_4_TreeAndBinaryTree/DS_4_2_BiTreeF.cpp b/DataStructure/DS_4_TreeAndBinaryTree/DS_4_2_BiTreeF.cpp new file mode 100644 index 0000000..36ad898 --- /dev/null +++ b/DataStructure/DS_4_TreeAndBinaryTree/DS_4_2_BiTreeF.cpp @@ -0,0 +1,38 @@ +// +// Created by Kim Yang on 2020/8/23. +// Copyright (c) Kim Yang All rights reserved. +// +#include + +//三叉链表——方便找父节点 +//带有一个指针指向父节点 +/**定义模块**/ +struct ElemType { + int value; +}; + +typedef struct BiTNode { + ElemType data;//数据域 + struct BiTNode *lchild, *rchild;//左右孩子指针 + struct BiTNode *parent;//指向父节点的指针 +} BiTNode, *BiTree; +/**定义模块**/ + + +/**实现模块**/ +//坐等填坑 + +/**实现模块**/ + + +/**测试模块**/ + +void testModule() { + +} + +/**测试模块**/ +int main() { + + return 0; +} \ No newline at end of file diff --git a/DataStructure/DS_4_TreeAndBinaryTree/DS_4_3_ThreadedBiTree.cpp b/DataStructure/DS_4_TreeAndBinaryTree/DS_4_3_ThreadedBiTree.cpp new file mode 100644 index 0000000..b352478 --- /dev/null +++ b/DataStructure/DS_4_TreeAndBinaryTree/DS_4_3_ThreadedBiTree.cpp @@ -0,0 +1,70 @@ +// +// Created by Kim Yang on 2020/8/23. +// Copyright (c) Kim Yang All rights reserved. +// +#include + +//线索二叉树 + +/**定义模块**/ + +struct ElemType { + int value; +}; + +typedef struct ThreadNode { + ElemType data;//数据域 + struct ThreadNode *lchild, *rchild;//左右孩子指针 + int ltag, rtag;//左右线索标志 +} ThreadNode, *ThreadTree; +/**定义模块**/ +ThreadNode *pre = NULL;//全局变量用于暂存当前访问结点的前驱 + +void visit(ThreadNode *q) { + if (q->lchild == NULL) {//左子树为空,建立前驱线索 + q->lchild = pre; + q->ltag = 1; + } + if (pre != NULL && pre->rchild == NULL) {//建立前驱结点的后继线索 + pre->rchild = q; + pre->rtag = 1; + } +} + +//中序遍历二叉树,一边遍历一边线索化 +void InThread(ThreadTree T) { + if (T != NULL) { + InThread(T->lchild); + visit(T); + InThread(T->rchild); + } +} + +//创建中序线索化二叉树T +void CreatInThread(ThreadTree T) { + pre = NULL; + if (T != NULL) {//非空二叉树才能线索化 + InThread(T);//中序线索二叉树 + if (pre->rchild == NULL) { + pre->rtag = 1;//处理遍历的最后最后一个结点 + } + } +} + +/**实现模块**/ +//坐等填坑 + +/**实现模块**/ + + +/**测试模块**/ + +void testModule() { + +} + +/**测试模块**/ +int main() { + + return 0; +} \ No newline at end of file