@iwktd981220
2017-11-24T12:24:18.000000Z
字数 3144
阅读 519
笔记
继续填坑
1. 面向对象,说的是面向一个类中同一样的不同对象使用相同的方法去实现一个目的。[好像这样理解并没有什么问题。
2. 从这个角度出发的话,对于一个二叉查找树,
初步构想的功能:
| 函数 | 功能(方法) | 类型 |
|---|---|---|
| void inOrder(); | 把所有的结点的数按照从小到大输出 | 树类 |
| list_t* search(type k); | 查找出key为k的结点 | 结点类 |
| list_t* searchIteration(type k); | 使用迭代完成上面的那个问题 | 结点类 |
| list_t* minimun(); | 找出树中最小的结点 | 树类 |
| list_t* maximun(); | 找出树中最大的结点 | 树类 |
| list_t* successor(); | 找出此结点的继承人 | 结点类 |
| void insert(type num); | 插入一个数据在树中 | 结点类 |
| void transplant(list_t <\type> *y,list_t<\type> *z); | 把子树y,移植到z的位置 | 结点类 |
| void Delete(type num); | 删除树中某一个结点 | 结点类 |
| Bst(); | 初始化一个树 | 树类 |
| Bst(list_t *n); | 以n为根生成子树 | 树类 |
| ~Bst(); | 释放内存什么的 | 结点类 |
| void print(list_t *p); | 把整个树的函数打印???[怎么又来了 |
貌似这个link在分清结点类和二叉树类这方面比较清晰。
因为主要是分好两个类各自的职能,结点类负责什么,二叉树类负责什么。
可能这就是所谓的代码设计的重要性啊
失败文件:见link
成功:BSTreeDone.cpp
#include <iostream>using namespace std;template <typename T>class Node{public:Node();void DeleteNodesRecursion();T key;Node *left;Node *right;Node *parent;Node<T>* search(T num);Node<T>* minimun();Node<T>* maximun();void print();private:};template <typename T>class BSTree {public:BSTree():root(nullptr){};~BSTree();void insert(T num);void deleteNode(T num);void inOrder() ;private:Node<T> *root;void transplant(Node<T> *x,Node<T> *y);};template <typename T>Node<T>::Node() {key = 0;left = nullptr;right = nullptr;}template <typename T>void Node<T>::DeleteNodesRecursion() {if (this) {Node<T> *l = this->left;Node<T> *r = this->right;delete this;l->DeleteNodesRecursion();r->DeleteNodesRecursion();}}template <typename T>Node<T>* Node<T>::search(T num) {if (this == NULL || this->key == num ) {return this;}if (this->key > num) {return left->search(num);}else {return right->search(num);}}template <typename T>Node<T>* Node<T>::minimun() {Node<T> *temp;temp = this;while (temp->left != NULL) {temp = (temp->left);}return temp;}template <typename T>Node<T>* Node<T>::maximun() {while (this->right) {this = this->right;}return this;}template <typename T>void Node<T>::print() {if(left != NULL)left->print();cout<<key;if(right != NULL)right->print();}template <typename T>BSTree<T>::~BSTree() {root->DeleteNodesRecursion();}template <typename T>void BSTree<T>::insert(T num) {Node<T> *z = new Node<T>;z->key = num;Node<T> *y = new Node<T>;y = nullptr;Node<T> *x = root;while (x != NULL) {y = x;if (x->key > z->key) {x= x->left;}else x = x->right;}z->parent = y;if (y == NULL) {root = z;}else if (y->key > z->key) {y->left = z;}else y->right = z;}template <typename T>void BSTree<T>::deleteNode(T num) {Node<T> *n = root->search(num);if (n->left == NULL) {transplant(n,n->right);}else if (n->right ==NULL ) {transplant(n,n->left);}else {Node<T> *min;min = n->right->minimun();if (min->parent != n) {transplant(min,min->right);min->right = n->right;min->right->parent = min;}transplant(n,min);min->left = n->left;min->left->parent = min;}}template <typename T>void BSTree<T>::inOrder() {root->print();}template <typename T>void BSTree<T>::transplant(Node<T> *x ,Node<T> *y) {if (x->parent == NULL) {x = y;}else if (x->parent->left == x) {x->parent->left = y;}else x->parent->right = y;if (y != NULL) {y->parent = x->parent;}}int main() {BSTree<int> tree;tree.insert(2);tree.insert(4);tree.insert(1);tree.insert(3);tree.inOrder();tree.deleteNode(4);tree.insert(5);tree.inOrder();return 0;}