BST(Binary Search Tree)

原文链接:http://blog.csdn.net/jarily/article/details/8679280

  1 /******************************************
  2 数据结构:
  3 BST(Binary Search Tree),二叉查找树;
  4
  5 性质:
  6 若结点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  7 若结点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  8 该结点的左、右子树也分别为二叉查找树;
  9
 10 遍历:
 11 对于一个已知的二叉查找树,从小到大输出其节点的值;
 12 只需对其进行二叉树的中序遍历即可;
 13 即递归地先输出其左子树,再输出其本身,然后输出其右子树;
 14 遍历的时间复杂度为O(n);
 15
 16 查找:
 17 对于一个已知的二叉查找树x;
 18 在其中查找特定的值k,函数Search返回指向值为k的节点指针;
 19 若找不到则返回0,算法时间复杂度为O(h),h为树的高度;
 20 理想情况下时间复杂度为lgn;
 21
 22 最大值和最小值:
 23 要查找二叉查找树中具有最小值的元素;
 24 只要从根节点开始,沿着左子树找到最左边的节点就可以了;
 25 反之沿着右子树查找则可以求最大值;
 26
 27 插入:
 28 从根节点开始插入;
 29 如果要插入的值小于等于当前节点的值,在当前节点的左子树中插入;
 30 如果要插入的值大于当前节点的值,在当前节点的右子树中插入;
 31 如果当前节点为空节点,在此建立新的节点,该节点的值为要插入的值,左右子树为空,插入成功;
 32
 33 删除:
 34 如果该没有子女,直接删除;
 35 如果该结点只有一个子女,则删除它,将其子女的父亲改为它的父亲;
 36 如果该结点有两个子女,先用其后继替换该节点,其后继的数据一并加在其后;
 37 *******************************************/
 38 #include<iostream>
 39 #include<cstring>
 40 #include<cstdlib>
 41 #include<cstdio>
 42 #include<climits>
 43 #include<algorithm>
 44 using namespace std;
 45
 46 const int N = 100000;
 47 int key[N], l[N], r[N], p[N];
 48 int u, node;
 49
 50 int Search(int x, int k)//查询
 51 {
 52     if(x == 0 || k == key[x])
 53         return x;
 54     if(k < key[x])
 55         return Search(l[x], k);
 56     else
 57         return Search(r[x], k);
 58 }
 59
 60 int Iterative_Search(int x, int k)//非递归版本的查询
 61 {
 62     while(x != 0 && k != key[x])
 63         if(k < key[x])
 64             x = l[x];
 65         else
 66             x = r[x];
 67     return x;
 68 }
 69
 70 int Minimum(int x)
 71 {
 72     while(l[x] != 0)
 73         x = l[x];
 74     return x;
 75 }
 76
 77 int Maximum(int x)
 78 {
 79     while(r[x] != 0)
 80         x = r[x];
 81     return x;
 82 }
 83
 84 int Successor(int x)
 85 {
 86     if(r[x] != 0)
 87         return Minimum(r[x]);
 88     int y = p[x];
 89     while(y != 0 && x == r[y])
 90     {
 91         x = y;
 92         y = p[y];
 93     }
 94     return y;
 95 }
 96
 97 int Predecessor(int x)
 98 {
 99     if(l[x] != 0)
100         return Maximum(l[x]);
101     int y = p[x];
102     while(y != 0 && x == l[y])
103     {
104         x = y;
105         y = p[y];
106     }
107     return y;
108 }
109
110 void Insert(int &T, int v)//插入结点
111 {
112     if(T == 0)
113         key[T = ++node] = v;
114     else if(v <= key[T])
115     {
116         p[l[T]] = T;
117         Insert(l[T], v);
118     }
119     else
120     {
121         p[r[T]] = T;
122         Insert(r[T], v);
123     }
124 }
125
126 void Iterative_Insert(int T, int v)//非递归版本插入结点
127 {
128     int y = 0;
129     int x = T;
130     int z = ++node;
131     key[z] = v;
132     while(x != 0)
133     {
134         y = x;
135         if(key[z] < key[x])
136             x = l[x];
137         else
138             x = r[x];
139     }
140     p[z] = y;
141     if(y == 0)
142         key[T] = z;
143     else if(key[z] < key[y])
144         l[y] = z;
145     else
146         r[y] = z;
147 }
148
149 void Transplant(int T, int u, int v)//移植过程;
150 //把一棵子树u归并到另一棵子树v中,u的父亲变为v的父亲,u的父亲就有了v作为其孩子。
151 {
152     if(p[u] == 0)
153         T = v;
154     else if(u == l[p[u]])
155         l[p[u]] = v;
156     else
157         r[p[u]] = v;
158     if(v != 0)
159         p[v] = p[u];
160 }
161
162 void Delete(int T, int z)//删除结点
163 {
164     if(l[z] == 0)
165         Transplant(T, z, r[z]);
166     else if(r[z] == 0)
167         Transplant(T, z, l[z]);
168     else
169     {
170         int y = Minimum(r[z]);
171         if(p[y] != z)
172         {
173             Transplant(T, y, r[y]);
174             r[y] = r[z];
175             p[r[y]] = y;
176         }
177         Transplant(T, z, y);
178         l[y] = l[z];
179         p[l[y]] = y;
180     }
181 }
182
183
184 int main()
185 {
186     int n;
187     scanf("%d",&n);
188     for(int i=0; i<n; i++)
189     {
190         int k;
191         scanf("%d",&k);
192         Insert(u, k);
193     }
194     Delete(u, Search(u, 1));
195     printf("%d\n",Search(u,2));
196     printf("%d\n",Maximum(u));
197     return 0;
198 }  
时间: 2024-10-23 10:50:03

BST(Binary Search Tree)的相关文章

数据结构-二叉搜索树(BST binary search tree)

本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 二叉搜索树简介 顾名思义,二叉搜索树是以一棵二叉树来组织的,这样的一棵树可以用一个链表数据结构来表示,每个节点除了key和卫星数据(除了二叉树节点的基本数据以外人为添加的数据,这些数据和树的基本结构无关),还有left.right.parent,分别指向节点的左孩子.右孩子和父节点,如果对应的节点不存在则指向NIL节点(因为最简单的二叉搜索树中的NIL节点里并没有有用的信息,所以在实现的时候简

【LeetCode】Balanced Tree &amp; Binary Search Tree

整合两道差不多的题目放上来,其中第一题是第二题的基础. 1. Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than one. 所谓

Lowest Common Ancestor of a Binary Search Tree (BST)

Given a binary search tree(BST), find the lowest common ancestor of two given nodes in the BST. Node* LCA(Node* root, Node* p, Node* q) { if (!root || !p || !q) return NULL; if (max(p->data, q->data) < root->data) return LCA(root->left, p,

【LeetCode】 Recover Binary Search Tree BST 中序遍历

题目:Recover Binary Search Tree <span style="font-size:18px;">/* * LeetCode: recover the binary search tree * 题目:二叉树中有两个节点被交换了位置,找出它们,并且将它们换回来,要求用o(n)的连续空间 * 知识点:1.BST树的特点:中序遍历后的节点的排列是按照非降的顺序 * 思路:按照特点中序遍历,当遇到逆序的节点则按照保存相关节点,注意分为,交换的两个点是否相邻的两

uva 1264 - Binary Search Tree(BST)

题目链接:uva 1264 - Binary Search Tree 题目大意:给定一个插入顺序,要求输出有多少种插入顺序,使得生成的BST一样. 解题思路:组合数学+BST的性质,起始左右两个子树的节点之间是没有影响的.所以逐层递推上去即可. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int max

UVA 1264 - Binary Search Tree(BST+计数)

UVA 1264 - Binary Search Tree 题目链接 题意:给定一个序列,插入二叉排序树,问有多少中序列插入后和这个树是同样的(包含原序列) 思路:先建树,然后dfs一遍,对于一个子树而言,仅仅要保证左边和右边顺序对就能够了,所以种数为C(左右结点总数,左结点),然后依据乘法原理乘上左右子树的情况就可以 代码: #include <cstdio> #include <cstring> typedef long long ll; const int MAXNODE =

[Leetcode][BST][Convert Sorted Array to Binary Search Tree]

把一个排好序的vector转换为一颗二分查找树. 很简单的题目,递归即可,保证边界不要出错. 1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 1

[Leetcode][BST][Validate Binary Search Tree]

判断一颗树是不是二分查找树,非常经典基础的一个算法. 我很久之前第一次做的时候,是先求出来了树的前序遍历的结果,然后判断这个数组排序后是否和排序前相同,还要判断重复虾米的,很纠结的一种做法. 后来思考了一下怎么用递归的思路做,觉得应该根据定义返回两个子树的最大值和最小值,写了一会代码,发现好麻烦,不太对的样子. 后来看了题解,发现是用了一种反向的思维,把上下界从树的顶端传下去,而不是自下而上的约束.作者太机智了. 1 /** 2 * Definition for binary tree 3 *

72【leetcode】经典算法- Lowest Common Ancestor of a Binary Search Tree(lct of bst)

题目描述: 一个二叉搜索树,给定两个节点a,b,求最小的公共祖先 _______6______ / ___2__ ___8__ / \ / 0 _4 7 9 / 3 5 例如: 2,8 -->6 2,4-–>2 原文描述: Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST. According to the definition of LCA