(第一段日常扯蛋,大家不要看)这几天就要回家了,osgearth暂时也不想弄了,毕竟不是几天就能弄出来的,所以打算过完年回来再弄。这几天闲着也是闲着,就掏出了之前买的算法导论看了看,把二叉搜索树实现了下。

一、算法导论中讲解

1、二叉搜索树

节点

每个节点包含key(关键字)、left(指向左孩子)、right(指向右孩子)、parent(指向父节点)。

额外可有可无num(相同关键字的节点个数)。

规则

整个二叉树的根节点的parent指向NULL,且唯一。

左子树上所有节点的key均小于其根节点的key。

右子树上所有节点的key均大于其根节点的key。

最低层的节点的left与right指向NULL。

2、二叉搜索树的遍历

二叉搜索树的遍历分为先序遍历,中序遍历,后序遍历(由x.key的输出位置决定)。

中序遍历即为按照key从大到小输出。

3、查询二叉树

循环查找

迭代查找

4、最大关键字元素和最小关键字元素

5、后继和前驱

6、插入

对于BST插入只能插入到最下层,例如插入13。

伪代码:

7、删除

删除分为三种情况

  1.删除节点的left(或者right)指向NULL,直接把right(或者left)提升到该节点处。

                      

  2.删除节点的right和left不为NULL,且其right的left为NULL,直接把right提升到该节点处。

  3.删除节点的right和left不为NULL,且其right的left不为NULL,找到删除节点的后继(即大于删除节点key的最小key所在节点y),把后继y的right提到后继y的位置(即让后继y的parent的left指向后继y的right),再用删除节点的right和left分别代替后继y的right和left,最后再用后继y把删除节点替换掉。

伪代码:

节点替换

删除

三、c++代码

#include <iostream>
#include <memory>
#include <vector> using namespace std; //节点结构
struct Node {
int key;
int num;
shared_ptr<Node> parent;
shared_ptr<Node> left;
shared_ptr<Node> right;
Node(int _key) : key(_key), num(),parent(NULL), left(NULL), right(NULL) {}
}; //循环插入
bool Insert(shared_ptr<Node>& root, int _key) {
shared_ptr<Node> node(new Node(_key));
if (root == NULL) {
root = node;
return true;
}
shared_ptr<Node> x = root;
shared_ptr<Node> y;
while(x != NULL) {
y = x;
if (node->key == x->key) {
x->num++;
return true;
}
if (node->key < x->key) x = x->left;
else x = x->right;
}
if (node->key < y->key) {
y->left = node;
node->parent = y;
}
else {
y->right = node;
node->parent = y;
}
return true;
} //迭代插入
bool reInsert(shared_ptr<Node>& root, shared_ptr<Node> node) {
if (root == NULL) {
root = node;
return true;
}
if (node->key == root->key) {
root->num++;
return true;
}
if (node->key < root->key) return reInsert(root->left, node);
else return reInsert(root->right, node);
} //创建二叉树
void BSTCreat(shared_ptr<Node>& root, vector<int> keys) {
for (int key : keys) {
Insert(root, key);
}
} //遍历
void showBST(shared_ptr<Node>& root) {
if (root != NULL) {
//     //cout << root->key << " ";//先序遍历
// showBST(root->left);
// cout << root->key << " "; //中序遍历
// showBST(root->right);
//     //cout << root->key << " ";//后序遍历
//cout << root->key << " "; //first
showBST(root->left);
cout << root->key << " "; //mid
showBST(root->right);
//cout << root->key << " "; //end
}
} //删除节点
bool Delete(shared_ptr<Node>& root, int _key) {
if(root == NULL) return false;
if(root->key < _key) return Delete(root->right, _key);
else if(root->key > _key)return Delete(root->left, _key);
else {
if (root->right==NULL) {
root = root->left;
return true;
}
if (root->left==NULL) {
root = root->right;
return true;
}
if (root->right->left==NULL) {
root->right->left = root->left;
root = root->right;
return true;
}
shared_ptr<Node> y = root->right;
while(y->left!=NULL) {
y = y->left;
}
y->parent->left = y->right;
y->right = root->right;
y->left = root->left;
root = y;
return true;
}
} bool isSubtree(shared_ptr<Node> pRootA, shared_ptr<Node> pRootB) {
if (pRootB == NULL) return true;
if (pRootA == NULL) return false;
if (pRootB->key == pRootA->key) {
return isSubtree(pRootA->left, pRootB->left)
&& isSubtree(pRootA->right, pRootB->right);
} else return false;
} bool HasSubtree(shared_ptr<Node> pRootA, shared_ptr<Node> pRootB)
{
if (pRootA == NULL || pRootB == NULL) return false;
return isSubtree(pRootA, pRootB) ||
HasSubtree(pRootA->left, pRootB) ||
HasSubtree(pRootA->right, pRootB);
} int main() {
vector<int> keys1{,,,,,,};
vector<int> keys2{,,}; shared_ptr<Node> root1;
shared_ptr<Node> root2;
BSTCreat(root1, keys1);
BSTCreat(root2, keys2); cerr << HasSubtree(root1, root2) << endl; return ; }

二叉搜索树(BST)的更多相关文章

  1. C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解

    剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...

  2. 萌新笔记之二叉搜索树(BST)

    前言,以前搞过线段树,二叉树觉得也就那样= =.然后数据结构的课也没怎么听过,然后下周期中考... 本来以为今天英语考完可以好好搞ACM了,然后这个数据结构期中考感觉会丢人,还是好好学习一波. 二叉搜 ...

  3. 给定一个二叉搜索树(BST),找到树中第 K 小的节点

    问题:给定一个二叉搜索树(BST),找到树中第 K 小的节点. 出题人:阿里巴巴出题专家:文景/阿里云 CDN 资深技术专家. 考察点: 1. 基础数据结构的理解和编码能力 2.  递归使用 参考答案 ...

  4. 在二叉搜索树(BST)中查找第K个大的结点之非递归实现

    一个被广泛使用的面试题: 给定一个二叉搜索树,请找出其中的第K个大的结点. PS:我第一次在面试的时候被问到这个问题而且让我直接在白纸上写的时候,直接蒙圈了,因为没有刷题准备,所以就会有伤害.(面完的 ...

  5. 二叉搜索树 (BST) 的创建以及遍历

    二叉搜索树(Binary Search Tree) : 属于二叉树,其中每个节点都含有一个可以比较的键(如需要可以在键上关联值), 且每个节点的键都大于其左子树中的任意节点而小于右子树的任意节点的键. ...

  6. [LeetCode] Convert BST to Greater Tree 将二叉搜索树BST转为较大树

    Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original B ...

  7. 二叉搜索树(BST)学习笔记

    BST调了一天,最后遍历参数错了,没药救了-- 本文所有代码均使用数组+结构体,不使用指针! 前言--BFS是啥 BST 二叉搜索树是基于二叉树的一种树,一种特殊的二叉树. 二叉搜索树要么是一颗空树, ...

  8. hdu 3791:二叉搜索树(数据结构,二叉搜索树 BST)

    二叉搜索树 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submiss ...

  9. 数据结构---二叉搜索树BST实现

    1. 二叉查找树 二叉查找树(Binary Search Tree),也称为二叉搜索树.有序二叉树(ordered binary tree)或排序二叉树(sorted binary tree),是指一 ...

随机推荐

  1. EM算法笔记

    EM算法在很多地方都用使用到,比如简单的K-means算法,还有在隐马尔可夫里面,也涉及到了EM算法,可见EM算法在机器学习领域的重要地位.在这里就写一下我对于EM算法的一些理解笔记.后续有新的理解也 ...

  2. 第一行代码 -3-1 软件也要拼脸蛋-UI界面

    <ListView android:id="@+id/list_view" android:layout_width="match_parent" and ...

  3. 一根数据线将zero w打造成上级代理路由

    目的:只要插上树莓派就使PC全部流量通过派走代理 将树莓派打造成上级路由,在任意有可用wifi的地方,让PC全部流量走代理实现代理匿名效果 (通过网线当上级路由也可以,这里不多说,方法一样) 由于是树 ...

  4. day15 Python全局变量和局部变量

    在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量. 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序. 当全局变量与局部变量同名时: 在定义局部变量的子程序内,局部变 ...

  5. AI 卷积神经网络

    卷积神经网络(Convolutional Neural Network,简称CNN),顾名思义,使用了卷积.不过,这里用到的卷积和数学中的不完全一致. 1.连续卷积 2.离散卷积 3.二维离散卷积 4 ...

  6. Java中关于类型自动提升的两个注意点。

    问题一:在进行赋值运算时,进行类型提升: 例如:short s1 = 1;s1 = s1 + 1; (错的编译通不过) short s2 = 1;s2 += 1;(正确,编译和运行都能通过) 为什么呢 ...

  7. SkylineDemoForWeb JavaScript二次开发示例代码

    SkylineDemoForWeb JavaScript二次开发示例代码 http://files.cnblogs.com/files/yitianhe/SkylineDemoForWeb.zip

  8. CF662C Binary Table FWT

    传送门 \(N \leq 20\)很小诶 一个暴力的思路是枚举行的翻转状态然后在列上贪心 复杂度为\(O(2^NM)\)显然过不去 考虑到可能有若干列的初始状态是一样的,那么在任意反转之后他们贪心的策 ...

  9. 微信小程序 wx.getUserInfo 解密 C# 代码 - 转

    public static string DecodeUserInfo(string raw, string signature,string encryptedData, string iv) { ...

  10. c# WPF 设置窗口一直在其中窗口后面/底层窗口

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...