zoukankan      html  css  js  c++  java
  • 二叉搜索树API

    struct BinarySearchTree {
    	Node* search(Node* node, int key) {
    		while (nil != node && key != node->key) {
    			if (key < node->key) {
    				node = node->leftChild;
    			} else {
    				node = node->rightChild;
    			}
    		}
    		return node;
    	}
    	Node* minimum(Node* node) {
    		while (nil != node->leftChild) {
    			node = node->leftChild;
    		}
    		return node;
    	}
    	Node* maximum(Node* node) {
    		while (nil != node->rightChild) {
    			node = node->rightChild;
    		}
    		return node;
    	}
    	Node* predecessor(Node* node) {
    		if (nil != node->leftChild) {
    			return maximum(node->leftChild);
    		}
    		while (nil != node->parent && node == node->parent->leftChild) {
    			node = node->parent;
    		}
    		return node->parent;
    	}
    	Node* successor(Node* node) {
    		if (nil != node->rightChild) {
    			return minimum(node->rightChild);
    		}
    		while (nil != node->parent && node == node->parent->rightChild) {
    			node = node->parent;
    		}
    		return node->parent;
    	}
    	void insert(Node* node) {
    		Node* father = nil;
    		Node* current = root;
    		while (nil != current) {
    			father = current;
    			if (node->key < current->key) {
    				current = current->leftChild;
    			} else {
    				current = current->rightChild;
    			}
    		}
    		node->parent = father;
    		if (nil == father) {
    			root = node;
    		} else if (node->key < father->key) {
    			father->leftChild = node;
    		} else {
    			father->rightChild = node;
    		}
    	}
    	void transplant(Node* des, Node* src) {
    		if (nil == des->parent) {
    			root = src;
    		} else if (des == des->parent->leftChild) {
    			des->parent->leftChild = src;
    		} else {
    			des->parent->rightChild = src;
    		}
    		if (nil != src) {
    			src->parent = des->parent;
    		}
    	}
    	void del(Node* node) {
    		if (nil == node->leftChild) {
    			transplant(node, node->rightChild);
    		} else if (nil == node->rightChild) {
    			transplant(node, node->leftChild);
    		} else {
    			Node* suc = minimum(node->rightChild);
    			if (suc->parent != node) {
    				transplant(suc, suc->rightChild);
    				suc->rightChild = node->rightChild;
    				suc->rightChild->parent = suc;
    			}
    			transplant(node, suc);
    			suc->leftChild = node->leftChild;
    			suc->leftChild->parent = suc;
    		}
    	}
    };
    

      

  • 相关阅读:
    03-链表
    23-自定义用户模型
    01-使用pipenv管理项目环境
    10-多线程、多进程和线程池编程
    17-Python执行JS代码--PyExecJS、PyV8、Js2Py
    09-Python-Socket编程
    08-迭代器和生成器
    07-元类编程
    06-对象引用、可变性和垃圾回收
    05-深入python的set和dict
  • 原文地址:https://www.cnblogs.com/lvcoding/p/7543530.html
Copyright © 2011-2022 走看看