• 二叉搜索树(BST)demo


    #include <iostream>
    
    using namespace std;
    
    class Node {
    public:
    	Node(int key_):left(NULL),right(NULL),key(key_){}
    	Node* left;
    	Node* right;
    	int key;
    };
    
    class BST {
    public:
    	BST() : root(NULL) {}
    
    	~BST() {
    		clear(root);
    	}
    
    	void clear(Node* node) {
    		if (node == NULL) return;
    		clear(node->left);
    		clear(node->right);
    		delete node;
    	}
    
    	Node* searchNode(int key) {
    		Node* result = root;
    		while(result != NULL) {
    			if (result->key == key) return result;
    			result = key < result->key ? result->left : result->right;
    		}
    		return result;
    	}
    
    	Node* minSubNode(Node* node) {
    		Node* result = node;
    		while(result->left != NULL) result = result->left;
    		return result;
    	}
    
    	void insertNode(Node*& node, Node* new_node) {
    		if (node == NULL) node = new_node;
    		else if (new_node->key < node->key) insertNode(node->left, new_node);
    		else insertNode(node->right, new_node);
    	}
    
    	void insertKey(int key) {
    		Node* new_node = new Node(key);
    		insertNode(root, new_node);
    	}
    
    	Node* parNode(Node* child_node) {
    		if (child_node == root) return NULL;
    		Node* result = root;
    		while (result->left != child_node && result->right != child_node)  
    			result =  child_node->key < result->key ? result->left : result->right;
    		return result;
    	}
    
    	void sliceNode(Node* slice_node) {
    		Node* par = parNode(slice_node);
    		Node* slice_child_node = slice_node->left != NULL ? slice_node->left : slice_node->right;
    		if (par == NULL) {
    			root = slice_child_node;
    		} else {
    			if (par->left == slice_node) par->left = slice_child_node;
    			else par->right = slice_child_node;
    		}
    	}
    
    	void deleteNode(Node* del_node) {
    		if (del_node->left == NULL || del_node->right == NULL) {
    			sliceNode(del_node);
    			delete del_node;
    		} else {
    			Node* suc_node = minSubNode(del_node->left);
    			sliceNode(suc_node);
    			del_node->key = suc_node->key;
    			delete suc_node;
    		}
    	}
    
    	bool deleteKey(int key) {
    		Node* del_node = searchNode(key);
    		if (del_node == NULL) return false;
    		deleteNode(del_node);
    		return true;
    	}
    
    private:
    	Node* root;
    };
    
    


     

  • 相关阅读:
    linq的多表查询
    markdown语法
    遍历Hashtable、IDictionary、Dictionary<string, string>
    DOS修改文件夹权限
    kangle 3.2.0 发布,国产开源web服务器
    nat上传文件到google
    黄聪:C#中用ILMerge将所有引用的DLL和exe文件打成一个exe文件,有图解
    UltiDev Web Server Pro
    vs2010 命令行下用 msbuild 发布web站点
    asp.net重启网站
  • 原文地址:https://www.cnblogs.com/java20130722/p/3206878.html
Copyright © 2020-2023  润新知