本题要求实现对建立中序线索二叉树和中序遍历中序线索二叉树。
输入格式:
输入为先序序列
输出格式:
输出为中序遍历线索树的结点值以及结点的左右指针信息。
输入样例:
在这里给出一组输入。例如:
AB@D@@CE@@@
输出样例:
B 1 0
D 1 1
A 0 0
E 1 1
C 0 1
提交结果:
思路分析:
此题乍一看,存在一点难度,实则看过我之前发的关于树的内容的推文的同学,已经知道了怎么写,运用先序创建树(来自《数据结构 树、二叉树(前半) 学习心得代码》),创建中序线索二叉树,线索中序遍历(来自《数据结构 二叉树(后半)、线索二叉树 学习心得代码》),此三个函数轻松复制,轻松求解(半路感觉不靠谱还可以用先序遍历树的算法测试一下先序创建树所创建的树是否符合要求,便于后面两个算法进行操作),具体算法内容以及介绍可移步上面两个推文,下面将对题意输入进行简单的分析,以便补充“先序创建树”内容。
输入是 “AB@D@@CE@@@” ,其中的@便是代表NULL空节点,所以创建树函数当检测到@符号时,将直接“return NULL;”,然后根据已知是先序序列,不难得到树的结构。下图给出了此输入应当得到的树:(红色位置即为@的作用,意即此处无结点)
代码展示:
//
// Created by DDD on 2023/12/2.
//
#include <stdio.h>
#include <malloc.h>
typedef struct Node{
char data;
struct Node *lchild, *rchild;
int ltag,rtag;
}BiTree, Node;
void InOrderThread(BiTree *root){ //线索中序遍历
BiTree *p = root;
while(p->ltag != 1)
p = p->lchild;
while(p){
printf("%c %d %d\n",p->data,p->ltag,p->rtag);
if(p->rtag == 1)
p = p->rchild;
else{
p = p->rchild;
while(p->ltag != 1)
p=p->lchild;
}
}
}
BiTree *pre = NULL;
void InThreaded(BiTree *root) { //中序线索树创建
if (root) {
InThreaded(root->lchild);
if (root->lchild == NULL)
root->ltag = 1;
else root->ltag = 0;
if (root->rchild == NULL)
root->rtag = 1;
else root->rtag = 0;
if (pre != NULL) {
if (pre->rtag == 1)
pre->rchild = root;
if (pre->ltag == 1)
pre->lchild = root;
}
pre = root;
InThreaded(root->rchild);
}
}
BiTree *PreCreateTree(){ //先序输入
BiTree *T;
char ch;
scanf("%c",&ch);
if(ch == '@')
return NULL;
else {
T = (BiTree *) malloc(sizeof (BiTree));
T->data = ch;
T->lchild = PreCreateTree();
T->rchild = PreCreateTree();
}
return T;
}
int main(){
BiTree Tree = *PreCreateTree();
InThreaded(&Tree);
InOrderThread(&Tree);
}
好久没更新,水一个博文
这些固定的算法一定要记好!!!