排序二叉树

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if i=j then if x=data[i] then search:=i else search:=0 else begin m:=(i+j) div 2;
if x=data[m] then search:=m if data[m]>x then search:=search(x,i,m-1); if data[m]<x then search:=search(x,m+1,j); end; End;
Function search(x:longint):longint; {返回关键字为x的节点编号,如不存在返回0,s为根结点编号} var i:longint;b:boolean; Begin
i:=s;b:=false; repeat
if data[i,1]=x then begin search:=i;b:=true;end else i:=data[i,2]
y:= data[i,3]; if y=0 then s:=data[i,2]
else data[y,2]:=data[i,2]; End;
定义(递归)
二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树 (Binary Search Tree)。
定义:二叉排序树或者是空树,或者是满足如下性质 的二叉树: ①若它的左子树非空,则左子树上所有结点的值均小于根 结点的值; ②若它的右子树非空,则右子树上所有结点的值均大于根 结点的值; ③左、右子树本身又各是一棵二叉排序树。 上述性质简称二叉排序树性质(BST性质),故二叉排序树 实际上是满足BST性质的二叉树。
左< 根< 右
特点
由BST性质可得: (1) 二叉排序树中任一结点x,其左(右)子树中任一结点y(若存 在)的关键字必小(大)于x的关键字。 (2) 二叉排序树中,各结点关键字是唯一的。 注意: 实际应用中,不能保证被查找的数据集中各元素的关键字互不相 同,所以可将二叉排序树定义中BST性质(1)里的"小于"改为"大 于等于",或将BST性质(2)里的"大于"改为"小于等于",甚至可同 时修改这两个性质。 (3) 按中序遍历该树所得到的中序序列是一个递增有序序列。
数组静态实现 (查找)
data:array of [1..maxn] of integer 查找: 二分查找O(logn)
Function search(x,i,j:longint):longint; {在i至j范围内查找,返回关键字为x的节点编号,如不存在返回0} var m:longint; Begin if i>j then begin search:=0;exit;end;
排序二叉树
Binary Sort Tree
线性表知识回顾
数组静态实现 链表实现
线性表知识回顾 数组静态实现
data:array of [1..maxn] of integer
查找: 插入: 删除:
顺序查找O(n) 二分查找O(logn) O(n) O(n)
数组静态实现 (查找)
data:array of [1..maxn] of integer
数组静态实现 (插入)
data:array of [1..maxn] of integer 插入: O(n)
procedure insert(x,k:longint):longint; {将关键字为x的节点插入到k号节点前面} var i:longint; Begin
for i:=n downto k do data[i+1]:=data[i]; data[k]:=x; n:=n+1; End;
线性表知识回顾 链表实现
data:array of [1..maxn,1..2] of integer data[i,2]表示元素data[i,1]的后继编号
查找: 顺序查找O(n)
插入: O(1)
删除: O(1)
链表实现 (查找 O(n) )
data:array of [1..maxn,1..2] of integer
until b or data[s,2]=0; if not(b) then search:=0; End;
链表实现 (插入 O(1) )
data:array of [1..maxn,1..2] of integer
procedure insert(x,i:longint); {将关键字为x的节点插入到i号节点后面} Begin
排序二叉树
6
4
8
来自百度文库
3
57
9
2
中序遍历:
123456789
1
2
1
3
1
1
2
3
32
3
3
2 1
1 2
排序二叉树
遍历(中序):O(n) 查找:O(logn) 插入: 直接递归 O(logn) 删除: O(logn) 先查找到该结点
无儿子: 直接删除O(1) 单个儿子: 用儿子代替它O(1) 两个儿子: 用后继(在右子树中一直左走)代替它
n:=n+1; data[n,2]:=data[i,2];data[n,1]:=x; data[i,2]:=n End;
链表实现 (删除 O(1) )
data:array of [1..maxn,1..3] of integer data[i,3]表示i号节点的父节点编号
procedure delete(i:longint); {删除i号节点} Begin
数组静态实现 (删除)
data:array of [1..maxn] of integer 删除: O(n)
procedure delete(x:longint); {删除k号节点} var i:longint; Begin
for i:=k+1 to n do data[i-1]:=data[i]; n:=n-1; End;
查找: 顺序查找O(n)
Function search(x:longint):longint; {返回关键字为x的节点编号,如不存在返回0} var i:longint;b:boolean; Begin
i:=1;b:=false; while (i<=n)and not(b) do
if data[i]=x then begin search:=i;b:=true;end; if i>n then search:=0; End;
相关文档
最新文档