HomeWork——Binary Search Tree
来源:互联网 发布:网络电影疯狂小镇 编辑:程序博客网 时间:2024/06/12 01:01
本次作业是建立一个Binary Search Tree,二叉搜索树。
二叉搜索树,也叫做排序二叉树,它具有如下性质:若它的左树不为空,则左树上所有节点的值均小于它的根节点值;若它的右子树不空,则右树上所有节点的值均大于它的根节点的值,它的左右子树有分别为二叉搜索树。
首先我们应设置节点的结构:
struct Node{
int val;
Node* left;
Node* right;
Node(int v, Node* l = NULL, Node* r = NULL) : val(v), left(l), right(r) {}
};
接着设计一个Binary Search Tree的类
- classBinarySearchTree {
- public:
- structNode {
- int val;
- Node* left;
- Node* right;
- Node(int v,Node* l= NULL,Node* r= NULL):
- val(v), left(l), right(r){
- }
- };
- BinarySearchTree();
- BinarySearchTree(const std::vector<int>&);
- ~BinarySearchTree();
- bool insertNode(int);
- bool searchNode(int);
- bool deleteNode(int);
- void clear();
- Node* getRoot()const;
- private:
- Node* root;
- };
queue<Node*> que;
if (root != NULL) {
que.push(root);
}
while (!que.empty()) {
Node* temp = que.front();
que.pop();
if (temp->left != NULL) {
que.push(temp->left);
}
if (temp->right != NULL) {
que.push(temp->right);
}
delete temp;
}
}
Node* temp = root;
if (temp == NULL) {
temp = new Node(value);
root = temp;
return true;
}
while (temp != NULL) {
if (temp->val == value) {
return false;
} else if (temp->val > value) {
if (temp->left == NULL) {
temp->left = new Node(value);
return true;
} else {
temp = temp->left;
}
} else {
if (temp->right == NULL) {
temp->right = new Node(value);
return true;
} else {
temp = temp->right;
}
}
}
return false;
}
bool BinarySearchTree::searchNode(int value) {
Node* temp = root;
while (temp != NULL) {
if (temp->val == value) {
return true;
} else if (temp->val > value) {
temp = temp->left;
} else {
temp = temp->right;
}
}
return false;
}
最后重点是删除节点的函数,这是本题的关键,因为删除的节点的左右儿子决定了删除节点的方法,一共有三种情况:
1,如果要删除的节点没有左右儿子,则直接删除即可,并前驱设为NULL
2,如果要删除的节点只有左儿子或者右儿子,先标记该节点的前驱和后继,之后删除该节点,并将该节点的后继接到该节点的前驱上。
3,如果要删除的节点既有左儿子也有右儿子,则可以找该节点的左树中值最大的节点或者右树值最小的节点。比如找左树值最大的节点,则将该节点的值与替换要删除的节点的值,标记这个左树最大值节点的前驱和后继,删除这个左树最大值得节点,并将这个左树最大值的节点的后继(如果存在),接到刚刚标记的前驱上面。(注意如果要删除的节点的左树只有一个节点则要另外考虑这种情况)。
下面是该算法的实现:
bool BinarySearchTree::deleteNode(int value) {
Node* temp = root;
Node* parent = root;
while (temp != NULL) {
if (temp->val == value) {
if (temp->left == NULL && temp->right == NULL) {
if (parent->left == temp) {
parent->left = NULL;
} else {
parent->right = NULL;
}
delete temp;
} else if (temp->left == NULL) {
if (parent->left == temp) {
parent->left = temp->right;
} else {
parent->right = temp->right;
}
delete temp;
} else if (temp->right == NULL) {
if (parent->left == temp) {
parent->left = temp->left;
} else {
parent->right = temp->left;
}
delete temp;
} else {
Node* s = temp->left;
Node* q = temp;
while (s->right != NULL) {
q = s;
s = s->right;
}
temp->val = s->val;
if (q != temp) {
q->right = s->left;
} else {
q->left = s->left;
}
}
return true;
} else if (temp->val > value) {
parent = temp;
temp = temp->left;
} else {
parent = temp;
temp = temp->right;
}
}
return false;
}
- HomeWork——Binary Search Tree
- Binary Search Tree/ Binary Sorted Tree —— BST
- leetcode——Recover Binary Search Tree
- LeetCode173——Binary Search Tree Iterator
- Binary Search Tree Iterator —— Leetcode
- 树——recover-binary-search-tree
- LeetCode—173 Binary Search Tree Iterator
- LeetCode98—Validate Binary Search Tree
- LeetCode99—Recover Binary Search Tree
- LeetCode173—Binary Search Tree Iterator
- Tree—Unique Binary Search Trees
- leetcode——98——Validate Binary Search Tree
- leetcode——173——Binary Search Tree Iterator
- pat1064 Complete Binary Search Tree (30)——递归
- 二叉查找树——Validate Binary Search Tree
- LeetCode——Convert Sorted Array to Binary Search Tree
- LeetCode——Convert Sorted List to Binary Search Tree
- leetcode 098 —— Validate Binary Search Tree
- 丢失的牛?_Lost Cows_POJ2182_线段树
- C++ Primer复制控制 13.3 析构函数
- 矩阵理解与线性代数直觉性丧失
- Android解析聚合数据之天气预报
- sqlite3数据库c语言常用接口应用实例
- HomeWork——Binary Search Tree
- Linux iptables配置实践
- virtualenv 指定 python 解释器的版本
- 收获很大的现场面试经历
- 鸟哥Java学习之Object类-面向对象
- ButterKnife源码分析
- linux文件和目录权限的查看及修改
- 第十一周项目训练9.3 存储班长信息的学生类
- Android中ListView的工作原理