线索二叉树建立及遍历

层序输入

中序遍历建立线索二叉树

利用头节点遍历线索二叉树

#include <bits/stdc++.h>
using namespace std;
typedef char ElemType;
#define MaxSize 100
enum Tag{Link,Thread};
//二叉链表的结构创建 
typedef struct BiTNode{
    ElemType data;
    struct BiTNode *lchild;
    struct BiTNode *rchild;
    Tag ltag,rtag;
}BiTNode,*BiTree;
//层序遍历的方式创建二叉树 
string tree;
BiTree pre,T1;
int CreateTreeSeqTraverse(BiTree &T,int i,int n){
    if(i>=n||i<0) T=NULL;
    else{
        T=(BiTree)malloc(sizeof(BiTNode));
        if(!T) return 0;
        T->ltag=Link;
        T->rtag=Link;
        T->data=tree[i];  
        CreateTreeSeqTraverse(T->lchild,2*i+1,n);
        CreateTreeSeqTraverse(T->rchild,2*i+2,n);
    } 
}  
//中序遍历线索二叉树 
void OrderTraverse(BiTree T){
    if(T){
        OrderTraverse(T->lchild);
        if(T->lchild==NULL){
            T->ltag=Thread;
            T->lchild=pre;
        }
        if(pre->rchild==NULL){
            pre->rtag=Thread;
            pre->rchild=T;
        }
        pre=T;
        OrderTraverse(T->rchild);
    }
} 
//给线索二叉树增加一个头节点
void inOrderThread(BiTree &p,BiTree T){
    p=(BiTree)malloc(sizeof(BiTNode));
    p->ltag=Link;
    p->rtag=Thread;
    p->rchild=p;
    if(!T) p->lchild=p;
    else{
        p->lchild=T;
        pre=p;
        OrderTraverse(T);
        p->rchild=pre;
        pre->rchild=p;
        pre->rtag=Thread;
    }
}
//线索二叉树中序遍历
void Traverse(BiTree p){
    BiTree q=p;
    while(p->ltag==Link)
        p=p->lchild;
    while(p!=q){
        cout<<p->data<<" ";
        p=p->rchild;
    }
} 
int main(){
    BiTree T=NULL,p=NULL;
    getline(cin,tree);
    CreateTreeSeqTraverse(T,0,tree.length());
    inOrderThread(p,T);
    Traverse(p);
}

 

posted @ 2021-11-14 17:09  不负韶华。  阅读(69)  评论(0)    收藏  举报