//中序线索化二叉树T
时间: 2023-09-18 14:06:09 浏览: 54
中序线索化二叉树是将一个二叉树按照中序遍历的顺序,将每个节点的左右子树指针指向其前驱和后继节点,从而将二叉树转换为一个线性结构。这个过程可以通过递归的方式实现,对于当前节点,先对其左子树进行线索化,然后将当前节点与其前驱节点进行线索化,最后对其右子树进行线索化。需要注意的是,为了方便线索化过程,需要在节点结构中添加一些标识位来表示当前节点是否有前驱或后继节点。
相关问题
用C语言写出中序线索化二叉树的遍历代码
当然,我很乐意回答您的问题。以下是用C语言编写中序线索化二叉树的遍历代码:
```
#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 100
/*定义线索二叉树节点*/
typedef struct ThreadNode {
int data;
struct ThreadNode *lchild, *rchild;
int ltag, rtag; //左标记与右标记
}ThreadNode, *ThreadTree;
/*全局变量存放线序链表*/
ThreadNode *pre = NULL;
/*初始化空线索二叉树*/
void InitThreadTree(ThreadTree &T) {
T = (ThreadNode *)malloc(sizeof(ThreadNode));
T->lchild = T->rchild = T;
T->ltag = T->rtag = 0;
}
/*通过中序遍历建立二叉树*/
void CreateInThreadTree(ThreadTree T) {
char ch;
scanf("%c", &ch);
if (ch == '#') {
T = NULL;
} else {
T = (ThreadNode *)malloc(sizeof(ThreadNode));
T->data = ch;
CreateInThreadTree(T->lchild);
if (T->lchild) {
T->ltag = 0;
} else {
T->ltag = 1;
}
CreateInThreadTree(T->rchild);
if (T->rchild) {
T->rtag = 0;
} else {
T->rtag = 1;
}
}
}
/*中序遍历线索化*/
void InThread(ThreadNode *p) {
if (p != NULL) {
InThread(p->lchild);
if (p->lchild == NULL) {
p->ltag = 1;
p->lchild = pre;
}
if (pre != NULL && pre->rchild == NULL) {
pre->rtag = 1;
pre->rchild = p;
}
pre = p;
InThread(p->rchild);
}
}
/*中序遍历线索二叉树*/
void InOrder(ThreadTree T) {
ThreadNode *p = T->lchild; //p指向根节点,也是第一个节点
while (p != T) {
while (p->ltag == 0) {
p = p->lchild;
}
printf("%c", p->data);
while (p->rtag == 1 && p->rchild !=T) {//向右线索遍历
p = p->rchild;
printf("%c", p->data);
}
p = p->rchild; //p指向右子树根节点
}
}
/*主函数*/
int main() {
ThreadTree T;
InitThreadTree(T);
printf("请输入中序序列,字母表示节点,#表示空节点:\n");
CreateInThreadTree(T);
InThread(T->lchild); //线索化中序遍历
printf("生成的中序线索二叉树中序序列为:\n");
InOrder(T); //输出中序序列
return 0;
}
```
希望我的回答能够帮到您,如果您还有其他问题,欢迎随时向我提问。
c语言1.先序遍历创建二叉树; 2.中序线索化二叉树; 3.分别通过 找前驱 和 找后继 的方式,遍历中序线索二叉树。
好的,我可以帮你解答这些问题。
1. 先序遍历创建二叉树的算法:
```
typedef struct BiTNode{
char data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
BiTree CreateBiTree(){
char ch;
scanf("%c", &ch);
if(ch == '#'){
return NULL;
}
BiTree root = (BiTree)malloc(sizeof(BiTNode));
root->data = ch;
root->lchild = CreateBiTree();
root->rchild = CreateBiTree();
return root;
}
```
2. 中序线索化二叉树的算法:
```
typedef struct ThreadNode{
char data;
struct ThreadNode *lchild, *rchild;
int ltag, rtag;
}ThreadNode, *ThreadTree;
ThreadNode* pre = NULL;
void InThread(ThreadTree p){
if(p){
InThread(p->lchild);
if(!p->lchild){
p->lchild = pre;
p->ltag = 1;
}
if(pre && !pre->rchild){
pre->rchild = p;
pre->rtag = 1;
}
pre = p;
InThread(p->rchild);
}
}
void CreateInThread(ThreadTree root){
pre = NULL;
if(root){
InThread(root);
if(!pre->rchild){
pre->rchild = NULL;
pre->rtag = 1;
}
}
}
```
3. 找前驱和找后继的算法:
```
ThreadNode* FirstNode(ThreadNode* p){
while(p->ltag == 0){
p = p->lchild;
}
return p;
}
ThreadNode* NextNode(ThreadNode* p){
if(p->rtag == 0){
return FirstNode(p->rchild);
}
else{
return p->rchild;
}
}
void InOrder(ThreadTree T){
ThreadNode* p = FirstNode(T);
while(p){
printf("%c ", p->data);
p = NextNode(p);
}
}
```
希望这些代码可以帮到你,如果还有其他问题,可以继续提问哦。