二叉排序树的源码

#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;
 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值