手がかりツリーの作成、中順遍歴、左右挿入
3874 ワード
#include <iostream>
#include <stdio.h>
using namespace std;
struct binTreeNode
{
char data;
bool lthread,rthread;
binTreeNode *lchild, *rchild;
};
// :
void creatBinTreePre(binTreeNode *&T)
{
char c;
c = getchar();
if('^' == c)
T = NULL;
else{
T = new binTreeNode;
T->data = c;
creatBinTreePre(T->lchild);
creatBinTreePre(T->rchild);
}
}
// :
void inOrderThreading(binTreeNode *&T, binTreeNode *&pre)
{
if(T){
inOrderThreading(T->lchild,pre);
if(!T->lchild){
T->lthread = true;
T->lchild = pre;
}
if(!pre->rchild){
pre->rthread = true;
pre->rchild = T;
}
pre = T;
inOrderThreading(T->rchild,pre);
}
}
//
void inithread(binTreeNode *&T, binTreeNode *&root)
{
binTreeNode *pre = new binTreeNode;
if( T ){
pre->lchild = T;
pre->rchild = pre;
root = pre;
inOrderThreading(T, pre);
pre->rthread = true;
pre->rchild = root;
}
else{
pre->lchild = pre;
pre->rchild = pre;
}
}
// :
binTreeNode *insucc(binTreeNode *tree)
{
binTreeNode *temp;
temp = tree->rchild;
if(!tree->rthread)
while(!temp->lthread)
temp = temp->lchild;
return temp;
}
// :
void tinorder(binTreeNode *tree)
{
binTreeNode *temp = tree;
while(1){
temp = insucc(temp);
if(temp == tree)
break;
cout<<temp->data<<endl;
}
}
//
binTreeNode *findParentNode(char c, binTreeNode *tree)
{
binTreeNode *temp = tree;
while(1){
temp =insucc(temp);
if(temp == tree)
break;
if(temp->data == c)
return temp;
}
}
//
void insertRight(binTreeNode *parent, binTreeNode *child)
{
binTreeNode *temp = NULL;
child->rchild = parent->rchild;
child->rthread = parent->rthread;
child->lchild = parent;
child->lthread = true;
parent->rchild = child;
parent->rthread = false;
if(!child->rthread){
temp = insucc(child);
temp->lchild = child;
}
}
//
void insertLeft(binTreeNode *parent, binTreeNode *child)
{
binTreeNode *temp = NULL;
if(!parent->lthread){
temp = parent->lchild;
while(insucc(temp) != parent){
temp = insucc(temp);
}
temp->rchild = child;
temp->rthread = true;
}
child->lchild = parent->lchild;
child->lthread = parent->lthread;
child->rchild = parent;
child->rthread = true;
parent->lchild = child;
parent->lthread = false;
}
int main()
{
binTreeNode *T = NULL, *root = NULL, *parent = NULL, *child = NULL;
char c;
creatBinTreePre( T );
inithread(T, root);
cout<<" :
";
tinorder(root);
cout<<"------------ ---------
";
cout<<" :";
cin>>c;
parent = findParentNode(c, root);
cout<<" :";
cin>>c;
child = new binTreeNode;
child->data = c;
insertRight(parent, child);
cout<<" :
";
tinorder(root);
cout<<"------------ ---------
";
cout<<" :";
cin>>c;
parent = findParentNode(c, root);
cout<<" :";
cin>>c;
child = new binTreeNode;
child->data = c;
insertLeft(parent, child);
cout<<" :
";
tinorder(root);
return 0;
}