数据结构与程序设计(26) 课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(2) 节点的右孩子默认为空(该节点为树中的最大值)。节点如果为叶子节点, 左孩子为空。节点如果为非叶子节点,找到k-1层的最后一个节点为左孩子。
(3) 关于增加节点的父节点判断,如果K+1பைடு நூலகம்存在,K+1层的最后一个节点的
右孩子为1/3空0/2,02当1 前点为K+1最后一个节数据点结的构右与孩程序子设。计
1/30/2021
数据结构与程序设计
6
建立过程分析:
问题:在插入最后一个节点之后,一棵二叉查找树是 否就建立成功了?
否,某些节点的右指针的值可能不正确,需要调整后才能生
成一棵树。
如右图,21个节 点插入之后,16, 20号节点的右孩 子没有初始化成 功。
原因是:如果只 插入21个节点, 在16号和20号 之间将出现断层。
1/30/2021
数据结构与程序设计
5
为了完成插入操作,引入一个辅助的结构:
List<Binary _node<entry>* > last_node;
last_node为List的对象,其中的每一个元素用来记录插入过程 中每一个层最后一个节点的指针。 last_node的第0个元素初始 化为空,叶子节点层记录在last_node的第1个元素中,依次类推。
继续从第i层向第3层搜索,处理右孩子的链接。直到搜索到第3层为 止。(叶子节点为第1层)
1/30/2021
数据结构与程序设计
8
Buildable Tree的构建方法
Step1,从有序序列中依次取出每个节点,按照Buildable Tree的构建方法在树中插入该节点。
Step2,全部节点插入成功之后,分析每层最后一个节点 的右孩子是否链接成功,依次处理每一层右孩子的连接。
Step3,右孩子的链接处理之后,获取当前二叉查找树的 根,构建结束。
当前二叉查找树根的地址存放于last_node的最后一个元素中。
1/30/2021
数据结构与程序设计
9
10.3.2 Declarations and the main function
template <class Record>
BOOK P463 FIGURE 10.12
1/30/2021
数据结构与程序设计
2
10.3 Building a Balanced Binary Search Tree
If the nodes of a complete binary tree are labeled in inorder sequence, starting with 1, then each node is exactly as many levels above the leaves as the highest power of 2 that divides its label.
数据结构与程序设计(26)
1/30/2021
数据结构与程序设计
1
10.3 P463 Building a Balanced Binary Search Tree
Problem: Start with an ordered list and build its entries into a binary search tree that is nearly balanced (“bushy”)[近似平衡的 树].
Binary_node<Record> * find_root(List < Binary_node<Record>* > &last_node); //插入结束,获得当前二叉查找树的根节点指针。
void connect_trees(const List < Binary_node<Record>* > &last_node); //根据last_node中的信息调整每一层最后一个节点中,右孩子的信息。
4
10.3.1 Getting Started
插入21个节点后的结果。
完成插入操作的关键,记住每一层最后一个节点的位置(指针)。 To establish future links, we must remember pointers to one node on each level, the last node processed on that level.
void build_insert(int count, const Record &new_data, List < Binary_node<Record>* > &last_node); //count,插入节点的编号; new_data插入信息。 // last_node 记录当前二叉查找树的每一层的最后一个节点的信息。
1/30/2021
数据结构与程序设计
7
在最后一个节点插入成功之后,需要进行右孩子
的处理:
方法:从最高层n依次向叶子节点方向查找,如果当前第k 层的最后一个节点node的右孩子为空。
依次查找第K-1层到1层的最后一个节点,如果当前层i的最后一个 节点比K层的最后一个节点node大,则找到它的右孩子。
};
1/30/2021
数据结构与程序设计
10
template <class Record>
Error_code Buildable_tree<Record> :: build_tree(const List<Record> &supply)
class Buildable_tree: public Search_tree<Record> {
public:
Error_code build_tree(const List<Record> &supply/*in*/); //构建二叉查找树,supply为有序元素的组合。
private: // Add auxiliary function prototypes here.
BOOK P464 FIGURE 10.13 X%24=0
X%23=0
X%22=0
1/30/2021
数据结构与程序设计
3
10.3.1 Getting Started
课堂练习:请写出按照这种方法插 入10个节点后,二叉查找树的结 构。
插入一个节点时的方法讨论:
(1) 判断该节点位于的层数。X%2k=0 ,K为满足条件的最大值。在10.3节, 层数从叶子节点开始计算。叶子节点位第0层。