zoukankan      html  css  js  c++  java
  • 二叉搜索树 问题不大

    直接贴代码

      1 #include <iostream>
      2 #include <algorithm>
      3 #include <vector>
      4 
      5 using namespace std;
      6 
      7 template<class item>
      8 class Node {
      9 public:
     10     item key;
     11     Node* left;
     12     Node* right;
     13     Node*p;
     14     Node(const Node& u):key(u.key),left(u.left),right(u.right),p(u.p){
     15     //    cout << "拷贝构造" << endl;
     16     }
     17     Node(item key):key(key),left(0),right(0),p(0){
     18     //    cout << "默认构造?" << key << endl;
     19     }
     20 };
     21 
     22 template<class T>
     23 class binaryTree {
     24 private:
     25     Node<T>* root;
     26     void destroy(Node<T>* u);
     27     void _inorder(Node<T>* u);
     28     void _print(ostream& os, Node<T>* u) {
     29         if (u == 0)return;
     30         if (u->p == 0)os << u->key << "是树根";
     31         else if (u->p->left == u)os << u->key << "" << u->p->key << "的左孩子";
     32         else os << u->key << "" << u->p->key << "的右孩子";
     33         os << endl;
     34         _print(os, u->left);
     35         _print(os, u->right);
     36     }
     37 public:
     38     //测试函数:打印
     39     void print() {
     40         _print(cout, root);
     41     }
     42     //测试函数:取根
     43     Node<T>* _getRoot() { return root; }
     44 
     45     ~binaryTree() { //析构函数不需释放内存,因为测试main里面用的并不是用new申请的动态内存
     46         //destroy(root);
     47     }
     48     binaryTree(Node<T>* root=0):root(root){}
     49 
     50     void inorder() { _inorder(root); }
     51     void insert(Node<T>* u);
     52     void remove(Node<T>* u);
     53     void transPlant(Node<T>*u, Node<T>* v);
     54     Node<T>* search(T k);
     55     Node<T>* maximum(Node<T>* u);
     56     Node<T>* minimum(Node<T>* u);
     57     Node<T>* predecessor(Node<T>* u);
     58     Node<T>* successor(Node<T>*);
     59 };
     60 template<class T>
     61 void binaryTree<T>::destroy(Node<T>* u) {
     62     if (u != 0) {
     63         destroy(u->left);
     64         destroy(u->right);
     65         delete u;
     66     }
     67 }
     68 
     69 template<class T>
     70 void binaryTree<T>::_inorder(Node<T>* u) {
     71     if (u) {
     72         _inorder(u->left);
     73         cout << u->key << endl;
     74         _inorder(u->right);
     75     }
     76 }
     77 
     78 template<class T>
     79 Node<T>* binaryTree<T>::search(T k) {
     80     Node<T>* u = root;
     81     while (u) {
     82         if (k == u->key)return u;
     83         else if (k < u->key)u = u->left;
     84         else u = u->right;
     85     }
     86     return u;//NULL
     87 }
     88 
     89 template<class T>
     90 Node<T>* binaryTree<T>::maximum(Node<T>* u) {
     91     while (u->right)
     92         u = u->right;
     93     return u;
     94 }
     95 
     96 template<class T>
     97 Node<T>* binaryTree<T>::minimum(Node<T>* u) {
     98     while (u->left)
     99         u = u->left;
    100     return u;
    101 }
    102 //前继节点
    103 template<class T>
    104 Node<T>* binaryTree<T>::predecessor(Node<T>* u) {
    105     if (u->left)return maximum(u->left);
    106 
    107     Node<T>* y = u->p;
    108     while (y&&u == y->left) {
    109         u = y;
    110         y = y->p;
    111     }
    112     return y;
    113 }
    114 //后继节点
    115 template <class T>
    116 Node<T>* binaryTree<T>::successor(Node<T>* u) {
    117     if (u->right)return minimum();
    118 
    119     Node<T>* y = u->p;
    120     while (y&&u == y->right) {
    121         u = y;
    122         y = y->p;
    123     }
    124     return y;
    125 }
    126 
    127 template<class T>
    128 void binaryTree<T>::insert(Node<T>* u) {
    129     Node<T>* pre = 0;
    130     Node<T>* cur = root;
    131     while (cur) {
    132         pre = cur;
    133         if (u->key < cur->key)cur = cur->left;
    134         else cur = cur->right;
    135     }
    136     u->p = pre;
    137 
    138     if (pre == 0)root = u;
    139     else if (u->key < pre->key)pre->left = u;
    140     else pre->right = u;
    141 }
    142 
    143 template<class T>
    144 void binaryTree<T>::transPlant(Node<T>*u, Node<T>* v) {
    145     if (u->p == 0)root = v;
    146     else if (u->p->left == u)u->p->left = v;
    147     else u->p->right = v;
    148     if (v)v->p = u->p;
    149 }
    150 
    151 template<class T>
    152 void binaryTree<T>::remove(Node<T>* u) {
    153     if (u == 0)return;
    154 
    155     if (u->left == 0)transPlant(u, u->right);
    156     else if (u->right == 0)transPlant(u, u->left);
    157     else {
    158         Node<T>* y = minimum(u->right);//找u的后继节点y,y没有左孩子
    159         if (y != u->right) {//
    160             transPlant(y, y->right);
    161             y->right = u->right;
    162             y->right->p = y;
    163         }
    164         transPlant(u, y);
    165         y->left = u->left;
    166         y->left->p = y;
    167     }
    168 
    169     //delete u;
    170 }
    171 
    172 /*typedef struct node node;
    173 struct node {
    174     node(const node&) { cout << "拷贝" << endl; }
    175     node(node&&) { cout << "移动" << endl; }
    176     node() { cout << "默认" << endl; }
    177     int xi;
    178 };*/
    179 
    180 
    181 int main(void) {
    182     binaryTree<int> xi;
    183     int a[10] = { 6,2,1,5,7,8,3,4 };
    184     vector<Node<int> > hhh;
    185     for (int i = 0;i < 8;i++) {
    186         Node<int> tmp(a[i]);
    187         hhh.push_back(tmp);
    188     }
    189     for (int i = 0;i < 8;i++)xi.insert(&hhh[i]);
    190     xi.print();
    191     
    192     xi.remove(xi._getRoot()->left);
    193     xi.print();
    194     return 0;
    195 }
  • 相关阅读:
    动态规划——Best Time to Buy and Sell Stock IV
    动态规划——Split Array Largest Sum
    动态规划——Burst Ballons
    动态规划——Best Time to Buy and Sell Stock III
    动态规划——Edit Distance
    动态规划——Longest Valid Parentheses
    动态规划——Valid Permutations for DI Sequence
    构建之法阅读笔记05
    构建之法阅读笔记04
    构建之法阅读笔记03
  • 原文地址:https://www.cnblogs.com/schsb/p/8609904.html
Copyright © 2011-2022 走看看