首页 > 其他 > 详细

二叉树中序遍历线索化

时间:2020-07-28 21:43:27      阅读:67      评论:0      收藏:0      [点我收藏+]
#include<iostream>
using namespace std;

struct BinaryTreeNode{
    int ltag,rtag;
    char data;
    BinaryTreeNode* leftChild;
    BinaryTreeNode* rightChild;
    BinaryTreeNode(char newdata,int newltag=0,int newrtag=0){
        data=newdata;
        ltag=newltag;
        rtag=newrtag;
    }
};
BinaryTreeNode* treeRoot;//声明树根节点指针

//前序和中序遍历重构二叉树
BinaryTreeNode* createBinaryTree(char* VLR,char* LVR,int n){
    if(n==0){
        return NULL;
    }
    int k=0;
    while(VLR[0]!=LVR[k]){
        k++;
    }
    BinaryTreeNode* p=new BinaryTreeNode(VLR[0]);
    p->leftChild=createBinaryTree(VLR+1,LVR,k);
    p->rightChild=createBinaryTree(VLR+k+1,LVR+k+1,n-k-1);
    return p;
}
void createInThread(BinaryTreeNode* current,BinaryTreeNode* &pre){
    if(current==NULL){
        return;
    }
    createInThread(current->leftChild,pre);
    if(current->leftChild==NULL){
        current->leftChild=pre;
        current->ltag=1;
    }
    if(pre!=NULL&&pre->rightChild==NULL){
        pre->rightChild=current;
        pre->rtag=1;
    }
    pre=current;
    createInThread(current->rightChild,pre);
}
//中序线索化二叉树
void createInThread(BinaryTreeNode* root){
    BinaryTreeNode* pre=NULL;
    if(root!=NULL){
        createInThread(root,pre);
        pre->rightChild=NULL;
        pre->rtag=1;
    }
}
//First
BinaryTreeNode* First(BinaryTreeNode* current){
    BinaryTreeNode* p=current;
    while(p->ltag==0){
        p=p->leftChild;
    }
    return p;
}
//Last
BinaryTreeNode* Last(BinaryTreeNode* current){
    BinaryTreeNode* p=current;
    while(p->rtag==0){
        p=p->rightChild;
    }
    return p;
}
//Next
BinaryTreeNode* Next(BinaryTreeNode* current){
    BinaryTreeNode* p=current->rightChild;
    if(current->rtag==0){
        return First(p);
    }else{
        return p;
    }
}
//Prior
BinaryTreeNode* Prior(BinaryTreeNode* current){
    BinaryTreeNode* p=current->leftChild;
    if(current->ltag==0){
        return Last(p);
    }else{
        return p;
    }
}
//中序遍历
void inOrder(BinaryTreeNode* root){
    BinaryTreeNode* p;
    for(p=First(root);p!=NULL;p=Next(p)){
        cout<<p->data;
    }
}
//前序遍历
void preOrder(BinaryTreeNode* root){
    BinaryTreeNode* p=root;
    while(p!=NULL){
        cout<<p->data;
        if(p->ltag==0){
            p=p->leftChild;
        }
        else if(p->rtag==0){
            p=p->rightChild;
        }
        else{
            while(p!=NULL&&p->rtag==1){
                p=p->rightChild;
            }
            if(p!=NULL) p=p->rightChild;
        }
    }
}
//寻找父节点
BinaryTreeNode* parent(BinaryTreeNode* t){
    BinaryTreeNode* p;
    if(t==treeRoot){
        return NULL;
    }
    for(p=t;p->ltag==0;p=p->leftChild);
    if(p->leftChild!=NULL){
        for(p=p->leftChild;p!=NULL&&p->leftChild!=t&&p->rightChild!=t;p=p->rightChild);
    }
    if(p==NULL||p->leftChild==NULL){
        for(p=t;p->rtag==0;p=p->rightChild);
        for(p=p->rightChild;p!=NULL&&p->leftChild!=t&&p->rightChild!=t;p=p->leftChild);
    }
    return p;
}
//后序遍历
void postOrder(BinaryTreeNode* root){
    cout<<"暂时没写";
}
int main(){
    char* vlr = "ABCDEFGH";//前序
    char* lvr = "CBEDFAGH";//中序
    //后序应为:CEFDBHGA
    treeRoot=createBinaryTree(vlr,lvr,8);//根据前序和中序序列创建二叉树,并返回根节点指针
    createInThread(treeRoot);
    cout<<"中序线索二叉树的中序遍历:";
    inOrder(treeRoot);
    cout<<endl;
    cout<<"前序线索二叉树的前序遍历:";
    preOrder(treeRoot);
    cout<<endl;
    cout<<"后序线索二叉树的后序遍历:";
    postOrder(treeRoot);
    cout<<endl;
    cout<<"查找父节点:";
    cout<<parent(treeRoot->leftChild)->data;//应该输出根节点data
    cout<<endl;
    return 0;
}

 

二叉树中序遍历线索化

原文:https://www.cnblogs.com/zzyf/p/13392667.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!