二叉排序树的源码

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

好的,下面是二叉排序树的基本操作的源码实现,包括创建、插入、查找和删除节点功能: ```python # 定义二叉树节点类 class TreeNode: def __init__(self, val): self.val = val self.left = None self.right = None # 定义二叉排序树class BinarySearchTree: def __init__(self): self.root = None # 向树中插入节点 def insert(self, val): if not self.root: self.root = TreeNode(val) else: self._insert(val, self.root) def _insert(self, val, node): if val < node.val: if node.left: self._insert(val, node.left) else: node.left = TreeNode(val) else: if node.right: self._insert(val, node.right) else: node.right = TreeNode(val) # 查找节点 def find(self, val): if self.root: res = self._find(val, self.root) if res: return True else: return False else: return False def _find(self, val, node): if not node: return None elif node.val == val: return node elif val < node.val: return self._find(val, node.left) else: return self._find(val, node.right) # 删除节点 def delete(self, val): if not self.root: return None else: self.root = self._delete(val, self.root) def _delete(self, val, node): if not node: return node if val < node.val: node.left = self._delete(val, node.left) elif val > node.val: node.right = self._delete(val, node.right) else: # 情况1:该节点没有子节点 if not node.left and not node.right: node = None # 情况2:该节点只有一个子节点 elif not node.left: node = node.right elif not node.right: node = node.left # 情况3:该节点有两个子节点 else: temp = self._find_min(node.right) node.val = temp.val node.right = self._delete(temp.val, node.right) return node def _find_min(self, node): while node.left: node = node.left return node ``` 以上就是二叉排序树的基本操作实现,包括创建、插入、查找和删除节点功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值