mirror of
https://github.com/Didnelpsun/CS408.git
synced 2026-06-17 07:27:12 +08:00
更新串
This commit is contained in:
@@ -143,6 +143,7 @@
|
||||
<ClCompile Include="main.c" />
|
||||
<ClCompile Include="sequence_stack.h" />
|
||||
<ClCompile Include="sequence_tree.cpp" />
|
||||
<ClCompile Include="thread_tree.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="double_link_list.h" />
|
||||
|
||||
@@ -24,6 +24,12 @@
|
||||
<ClCompile Include="sequence_stack.h">
|
||||
<Filter>头文件</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="sequence_tree.cpp">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="thread_tree.h">
|
||||
<Filter>头文件</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="link_list.h">
|
||||
@@ -47,5 +53,14 @@
|
||||
<ClInclude Include="link_queue.h">
|
||||
<Filter>头文件</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="link_string.h">
|
||||
<Filter>头文件</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="link_tree.h">
|
||||
<Filter>头文件</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="sequence_string.h">
|
||||
<Filter>头文件</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -3,7 +3,7 @@
|
||||
#include "head.h"
|
||||
#include "sequence_queue.h"
|
||||
|
||||
// 链树
|
||||
// 链二叉树
|
||||
typedef struct LinkTreeNode {
|
||||
element_type data;
|
||||
// 左右孩子结点
|
||||
@@ -110,12 +110,12 @@ int LevelorderTraversalLinkTree(LinkTree tree, int(*visit)(LinkTree elem)) {
|
||||
while (IsSequenceQueueEmpty(queue) == 0) {
|
||||
// 队头出队
|
||||
//ExitSequenceQueue(&queue, &p);
|
||||
visit(p);
|
||||
if (p->lchild != NULL) {
|
||||
//EnterSequenceQueue(&queue, p->lchild);
|
||||
//visit(p);
|
||||
/*if (p->lchild != NULL) {
|
||||
EnterSequenceQueue(&queue, p->lchild);
|
||||
}
|
||||
if (p->rchild != NULL) {
|
||||
//EnterSequenceQueue(&queue, p->rchild);
|
||||
}
|
||||
EnterSequenceQueue(&queue, p->rchild);
|
||||
}*/
|
||||
}
|
||||
}
|
||||
46
Code/sequence_tree.h
Normal file
46
Code/sequence_tree.h
Normal file
@@ -0,0 +1,46 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "head.h"
|
||||
|
||||
// 双亲树结点
|
||||
typedef struct ParentTreeNode {
|
||||
element_type data;
|
||||
// 双亲位置域
|
||||
int parent;
|
||||
} ParentTreeNode;
|
||||
|
||||
typedef struct {
|
||||
// 双亲树结点
|
||||
ParentTreeNode nodes[MAXSIZE];
|
||||
// 结点树
|
||||
int n;
|
||||
} ParentTree;
|
||||
|
||||
// 孩子树孩子结点
|
||||
typedef struct ChildTreeChildNode {
|
||||
// 孩子结点在数组中的索引位置
|
||||
int child;
|
||||
// 下一个孩子
|
||||
struct ChildTreeChildNode* next;
|
||||
} ChildTreeChildNode;
|
||||
|
||||
// 孩子树结点
|
||||
typedef struct {
|
||||
element_type data;
|
||||
// 指向第一个孩子
|
||||
ChildTreeChildNode* first_child;
|
||||
} ChildTreeNode;
|
||||
|
||||
// 孩子树
|
||||
typedef struct {
|
||||
ChildTreeNode nodes[MAXSIZE];
|
||||
// 结点树与根的位置
|
||||
int n, r;
|
||||
} ChildTree;
|
||||
|
||||
// 孩子兄弟树
|
||||
typedef struct ChildSiblingTreeNode {
|
||||
element_type data;
|
||||
// 第一个孩子与右兄弟指针
|
||||
struct ChildSiblingTreeNode* first_child, * next_sibling;
|
||||
} ChildSiblingTreeNode, * ChildSiblingTree;
|
||||
81
Code/thread_tree.h
Normal file
81
Code/thread_tree.h
Normal file
@@ -0,0 +1,81 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "head.h"
|
||||
|
||||
// 线索二叉树结点
|
||||
typedef struct ThreadTreeNode {
|
||||
element_type data;
|
||||
struct ThreadTreeNode* lchild, * rchild;
|
||||
int ltag, rtag;
|
||||
} ThreadTreeNode, *ThreadTree;
|
||||
|
||||
// 全局变量,指向当前访问点的前驱
|
||||
ThreadTreeNode* pre = NULL;
|
||||
// 中序线索化
|
||||
int InorderThread(ThreadTreeNode* node) {
|
||||
// 左子树为空,建立前驱线索
|
||||
if (node->lchild == NULL) {
|
||||
node->lchild = pre;
|
||||
node->ltag = 1;
|
||||
}
|
||||
if (pre != NULL && pre->rchild==NULL) {
|
||||
// 建立前驱结点的后继线索
|
||||
pre->rchild = node;
|
||||
pre->rtag = 1;
|
||||
}
|
||||
pre = node;
|
||||
}
|
||||
|
||||
// 找到以node为根结点的子树中第一个被中序遍历的结点
|
||||
ThreadTreeNode* FristInOrderNode(ThreadTreeNode* node) {
|
||||
//循环找到最左下角结点,不一定是叶子结点
|
||||
while (node->ltag == 0) {
|
||||
node = node->lchild;
|
||||
}
|
||||
return node;
|
||||
}
|
||||
|
||||
// 在中序线索二叉树中找到结点node的后继结点
|
||||
ThreadTreeNode* NextInOrderNode(ThreadTreeNode* node) {
|
||||
// 如果有右子树
|
||||
if (node->rtag == 0) {
|
||||
return FristInOrderNode(node->rchild);
|
||||
}
|
||||
else {
|
||||
return node->rchild;
|
||||
}
|
||||
}
|
||||
|
||||
// 对中序线索二叉树实现非递归的中序遍历
|
||||
int InorderTraversalThreadTree(ThreadTree tree, int(*visit)(ThreadTreeNode* node)) {
|
||||
for (ThreadTreeNode* p = FristInOrderNode(tree); p != NULL; p = NextInOrderNode(p)) {
|
||||
visit(p);
|
||||
}
|
||||
}
|
||||
|
||||
// 找到以node为根结点的子树中前面最后一个被中序遍历的结点
|
||||
ThreadTreeNode* LastInOrderNode(ThreadTreeNode* node) {
|
||||
//循环找到最右下角结点,不一定是叶子结点
|
||||
while (node->rtag == 0) {
|
||||
node = node->rchild;
|
||||
}
|
||||
return node;
|
||||
}
|
||||
|
||||
// 在中序线索二叉树中找到结点node的前驱结点
|
||||
ThreadTreeNode* PreInOrderNode(ThreadTreeNode* node) {
|
||||
// 如果有左子树
|
||||
if (node->ltag == 0) {
|
||||
return LastInOrderNode(node->rchild);
|
||||
}
|
||||
else {
|
||||
return node->lchild;
|
||||
}
|
||||
}
|
||||
|
||||
// 对中序线索二叉树实现非递归的逆向中序遍历
|
||||
int ReverseInorderTraversalThreadTree(ThreadTree tree, int(*visit)(ThreadTreeNode* node)) {
|
||||
for (ThreadTreeNode* p = LastInOrderNode(tree); p != NULL; p = PreInOrderNode(p)) {
|
||||
visit(p);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user