您的位置:首页 > 其它

二叉排序树的源码

2012-10-10 13:56 281 查看
#include<iostream>

#include<stack>

#include<queue>

using namespace std;

class Node

{

public:

int data;

Node *parent;

Node *left;

Node *right;

int tag;

public:

Node() :data(-1),parent(NULL),left(NULL),right(NULL),tag(0){};

Node(int num) : data(num),parent(NULL),left(NULL),right(NULL),tag(0){};

};

class Tree

{

public:

Tree(int num[],int len);

void insertNode(int data);

void insertNode1(int data);

Node *searchNode(int data);

void deleteNode(int data);

void InorderTree();

void InorderTreeRec();

void PreorderTree();

void PreorderTreeRec();

void PostorderTree();

void PostorderTreeRec();

void LevelorderTree();

bool IsSortedTree(Tree tree);

private:

void insertNode(Node *current,int data);

Node *searchNode(Node *current,int data);

void deleteNode(Node *current);

void InorderTree(Node *current);

void PreorderTree(Node *current);

void PostorderTree(Node *current);

private:

Node *root;

};

Tree::Tree(int num[],int len)

{

root=new Node(num[0]);

for(int i=1;i<len;i++)

{

insertNode1(num[i]);

}

}

void Tree::insertNode1(int data)

{

Node *p,*par;

Node *newNode=new Node(data);

p=par=root;

while(NULL!=p)

{

par=p;

if(data>p->data)

{

p=p->right;

}

else if(data<p->data)

{

p=p->left;

}

else if(data==p->data)

{

delete newNode;

return;

}

}

newNode->parent=par;

if(par->data>newNode->data)

{

par->left=newNode;

}

else

{

par->right=newNode;

}

}

void Tree::insertNode(int data)

{

if(NULL!=root)

{

insertNode(root,data);

}

}

void Tree::insertNode(Node *current,int data)

{

if(data<current->data)

{

if(NULL==current->left)

{

current->left=new Node(data);

current->left->parent=current;

}

else

{

insertNode(current->left,data);

}

}

else if(data>current->data)

{

if(NULL==current->right)

{

current->right=new Node(data);

current->right->parent=current;

}

else

{

insertNode(current->right,data);

}

}

return;

}

Node * Tree::searchNode(int data)

{

Node *current=NULL;

if(NULL!=root)

{

current=searchNode(root,data);

}

return current;

}

Node * Tree::searchNode(Node *current,int data)

{

if(data<current->data)

{

if(NULL==current->left)

return NULL;

return searchNode(current->left,data);

}

else if(data>current->data)

{

if(NULL==current->right)

return NULL;

return searchNode(current->right,data);

}

return current;

}

void Tree::deleteNode(int data)

{

Node *current=NULL;

current=searchNode(data);

if(NULL!=current)

{

deleteNode(current);

}

}

void Tree::deleteNode(Node *current)

{

if(NULL!=current->left)

{

deleteNode(current->left);

}

else if(NULL!=current->right)

{

deleteNode(current->right);

}

if(NULL==current->parent)

{

delete current;

root=NULL;

return;

}

if(current->parent->data>current->data)

{

current->parent->left=NULL;

}

else

{

current->parent->right=NULL;

}

delete current;

}

void Tree::InorderTree()

{

if(NULL==root)

{

return;

}

InorderTree(root);

}

void Tree::InorderTree(Node *current)

{

if(NULL!=current)

{

InorderTree(current->left);

cout<<current->data<<" ";

InorderTree(current->right);

}

}

void Tree::InorderTreeRec()

{

stack<Node *> s;

Node *p=root;

while(NULL!=p||!s.empty())

{

while(NULL!=p)

{

s.push(p);

p=p->left;

}

if(!s.empty())

{

p=s.top();

s.pop();

cout<<p->data<<" ";

p=p->right;

}

}

}

void Tree::PreorderTree()

{

if(NULL==root)

{

return;

}

PreorderTree(root);

}

void Tree::PreorderTree(Node *current)

{

if(NULL!=current)

{

cout<<current->data<<" ";

PreorderTree(current->left);

PreorderTree(current->right);

}

}

void Tree::PreorderTreeRec()

{

stack<Node *> s;

Node *p=root;

while(NULL!=p||!s.empty())

{

while(NULL!=p)

{

cout<<p->data<<" ";

s.push(p);

p=p->left;

}

if(!s.empty())

{

p=s.top();

s.pop();

p=p->right;

}

}

}

void Tree::PostorderTree()

{

if(NULL==root)

{

return;

}

PostorderTree(root);

}

void Tree::PostorderTree(Node *current)

{

if(NULL!=current)

{

PostorderTree(current->left);

PostorderTree(current->right);

cout<<current->data<<" ";

}

}

void Tree::PostorderTreeRec()

{

stack<Node *> s;

Node *p=root;

while(NULL!=p||!s.empty())

{

while(NULL!=p)

{

s.push(p);

p=p->left;

}

if(!s.empty())

{

p=s.top();

if(p->tag)

{

cout<<p->data<<" ";

s.pop();

p=NULL;

}

else

{

p->tag=1;

p=p->right;

}

}

}

}

void Tree::LevelorderTree()

{

queue<Node *> q;

Node *ptr=root;

q.push(root);

while(!q.empty())

{

ptr=q.front();

q.pop();

cout<<ptr->data<<" ";

if(NULL!=ptr->left)

{

q.push(ptr->left);

}

if(NULL!=ptr->right)

{

q.push(ptr->right);

}

}

}

bool Tree::IsSortedTree(Tree tree)

{

int lastvalue=0;

stack<Node *> s;

Node *p=tree.root;

while(NULL!=p||!s.empty())

{

while(NULL!=p)

{

s.push(p);

p=p->right;

}

if(!s.empty())

{

p=s.top();

s.pop();

if(0==lastvalue||lastvalue<p->data)

{

lastvalue=p->data;

}

else if(lastvalue>=p->data)

{

return false;

}

p=p->right;

}

}

return true;

}

int main()

{

int num[]={5,3,7,2,4,6,8,1};

Tree tree(num,8);

cout<<"Inorder:";

tree.InorderTree();

cout<<"\nInorder:";

tree.InorderTreeRec();

cout<<endl<<endl;

cout<<"Perorder:";

tree.PostorderTree();

cout<<"\nPreorder: ";

tree.PostorderTreeRec();

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: