一个简单的排序二叉树的实现

一,首先建立节点

#ifndef __NODE__
#define __NODE__

template<typename T>
struct Node {
 Node<T>() {
  left = 0;
  right = 0;
  value = 0;
 }
 Node<T>(T value) {
  left = 0;
  right = 0;
  this ->value = value;
 }
 T value;
 Node<T> *left;
 Node<T> *right;
};

#endif

 

然后再实现其排序二叉树,其源代码如下:

#include "Node.h"
#include <iostream>
using namespace std;

template<typename T>
class SortBiTree {
public:
 SortBiTree();
 SortBiTree(Node<T> *root);
 ~SortBiTree();
 int GetSize() const { return size; }
 Node<T> *GetRoot() const { return root; }
 bool Insert(T value, Node<T> *cur);
 bool Delete(T value, Node<T> *cur);
 void MidOrder(Node<T> *cur);//中序遍历
 void PreOrder(Node<T> *cur);//前序遍历
 void Clear(Node<T> *root);
 Node<T> *Search(T value);
 int GetHeight();
private:
 void Print(Node<T> *nd);
 int GetHeight(Node<T> *cur);
private:
 Node<T> *root;
 int size;
 int height;
};

template<typename T> SortBiTree<T>::SortBiTree() {
 this ->size = 0;
 this ->height = 0;
 this ->root = NULL;
}

template<typename T> SortBiTree<T>::SortBiTree(Node<T> *root) {
 SortBiTree();
 this ->root = root;
 this ->size++;
}

template<typename T> SortBiTree<T>::~SortBiTree() {
 if(root != NULL)
  Clear(root);
}

template<typename T> void SortBiTree<T>::Clear(Node<T> *root) {
 if(root != NULL) {
  Clear(root ->left);
  Clear(root ->right);
  delete root;
  root = NULL;
 }
}

template<typename T> Node<T> *SortBiTree<T>::Search(T value) {
 Node<T> *cur = root; 
 while(cur != NULL) {
  if(cur ->value > value)
   cur = cur ->left;
  else if(cur ->value < value)
   cur = cur ->right;
  else
   return cur;
 }
 return NULL;
}

template<typename T> int SortBiTree<T>::GetHeight() {
 height = GetHeight(root);
 return height;
}

template<typename T> int SortBiTree<T>::GetHeight(Node<T> *cur) {
 int lh, rh;
 if(cur != NULL) {
  lh = GetHeight(cur ->left);
  rh = GetHeight(cur ->right);
  return lh > rh ? lh + 1 : rh + 1;
 }
 else {
  return 0;
 }
}

//以下使用递归的方式
template<typename T> bool SortBiTree<T>::Insert(T value, Node<T> *cur) {
 if(root == NULL) {
  root = new Node<T>(value);
  root ->left = NULL;
  root ->right = NULL;
  size++;
  return true;
 }
 if(cur != NULL) { 
  if(cur->value == value) {
   cout << "已经存在此元素" << endl;
   return false;
  }
  else if(cur ->value < value && cur ->right != NULL)
   return Insert(value, cur ->right);
  else if(cur ->value > value && cur ->left != NULL)
   return Insert(value, cur ->left);
  
  Node<T> *newNode = new Node<T>(value);   
  if(cur ->value > value) {   
   cur ->left = newNode;  
  }
  else {  
   cur ->right = newNode;  
  }
  size++;  
 }
 return true;
}


template<typename T> bool SortBiTree<T>::Delete(T value, Node<T> *cur) {
 if(root != NULL && root ->value == value) {
  Node<T> *p = cur ->right, *pre = cur;
  while(p ->left != NULL) {
   pre = p;
   p = p ->left;
  }
  pre ->left = p ->right;
  p ->left = cur ->left;
  p ->right = cur ->right; 
  this ->root = p;  
  delete cur;
  size--;
  return true;
 } 
 
 if(cur != NULL) { 
  Node<T> *c = NULL;
  Node<T> *parent = cur;
  if(cur ->value > value) {
   if(cur ->left != NULL && cur ->left ->value != value) {
    Delete(value, cur ->left);
   }
   else if(cur ->left != NULL && cur ->left ->value == value) {
    c = cur ->left;
   }
  }
  else if(cur ->value < value) {
   if(cur ->right != NULL && cur ->right ->value != value) {
    Delete(value, cur ->right);
   }
   else if(cur ->right != NULL && cur ->right ->value == value) {
    c = cur ->right;
   }
  }  
  
  if(c != NULL) {
   if(c ->left == NULL && c ->right == NULL) {
    c == parent ->right ? parent ->right = NULL : parent ->left = NULL; 
    delete c;
    c = NULL;
   }
   else if(c ->left != NULL && c ->right == NULL) {
    Node<T> *p = c;
    c == parent ->right ? parent ->right = c ->left : parent ->left = c ->left;   
    delete p;
   }
   else if(c ->left == NULL && c ->right != NULL) {
    Node<T> *p = c;
    c == parent ->right ? parent ->right = c ->left : parent ->left = c ->left; 
    delete p;
   }
   else {
    Node<T> *p = c ->right, *temp;
    Node<T> *pre = p;
    while(p ->left != NULL) {
     pre = p;
     p = p ->left;
    }   
    pre ->left = p ->right;
    p ->left = c ->left;
    if(c ->right != p)
     p ->right = c ->right;     
    if(parent ->right == c) {
     parent ->right = p;
    }
    else {
     parent ->left = p;
    }   
    delete c;     
   } 
   size --;
   return true;
  }

  else {
   cout << "找不到此元素" << endl;
   return false;
  }
 }
 return false;
}

template<typename T> void SortBiTree<T>::Print(Node<T> *nd) {
 cout << nd->value << " ";
}

template<typename T> void SortBiTree<T>::MidOrder(Node<T> *cur) {
 if(cur != NULL) {
  MidOrder(cur ->left);
  Print(cur);
  MidOrder(cur ->right);
 }
}

template<typename T> void SortBiTree<T>::PreOrder(Node<T> *cur) {
 if(cur != NULL) {
  Print(cur);
  PreOrder(cur ->left);
  PreOrder(cur ->right);
 }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值