数据结构-二叉查找树

前序遍历:

后序遍历:

二叉查找树按照二叉树进行组织。二叉查找树关键字的存储方式总是瞒住二叉查找树性质:

设x为二查查找树种一个节点。如果y是x的左子树中的一个节点,那么key[x] >= key[y]。如果y是x的右子树的一个节点,那么key[x] <= key[y]。

这样对二叉查找树进行中序遍历就可得到书中所有元素的一个非降序排列。

查找某一个存在节点的前驱和后继。某一个节点x的后继就是大于key[x]的关键字中最小的那个节点,前驱就是小于key[x]的关键字中最大的那个节点。查找二叉前驱和后继节点的算法如下所示:

 1 typedef struct _node {
 2     struct _node *left_child;
 3     struct _node *right_child;
 4     struct _node * parent;
 5     ctype    data;
 6 }node; //树节点数据结构定义
 7
 8 typedef node* Tree;
 9
10 //查找二叉查找树中关键字最小的节点,返回指向该节点的指针
11 Tree tree_minimum(Tree root)
12 {
13     Tree p = root;
14     while (p->left_child != null)
15         p = p->left_child;
16     return p;
17 }
18
19 //查找二叉查找树中关键字最大的节点,返回指向该节点的指针
20 Tree tree_maxmum(Tree root)
21 {
22     Tree p = root;
23
24     while (p->right_child != null)
25     {
26         p = p->right_child;
27     }
28     return p;
29 }
30
31 //查找二叉查找树中节点x的后继节点,返回指向该节点的指针
32 //在查找过程中,如果节点x右子树不为空,那么返回右子树的最小节点即可
33 //如果节点x的右子树为空,那么后继节点为x的某一个祖先节点的父节点,而且该祖先节点是作为其父节点的左儿子
34 Tree tree_successor(Tree x)
35 {
36     if (x->right_child != null)
37         return tree_minimum(x->right_child);
38
39     //x用来保存待确定的节点
40     //y为x的父节点
41     Tree y = x->parent;
42
43     while (y != NULL && x == y->right_child)
44     {
45         x = y;
46         y = y->parent;
47     }
48     return y;
49 }
50
51
52 //查找二叉查找树中节点x的前驱节点,返回指向该节点的指针
53 //在查找过程中,如果节点x左子树不为空,那么返回左子树的最大节点即可
54 //如果节点x的左子树为空,那么前驱节点为x的某一个祖先节点的父节点,而且该祖先节点是作为其父节点的右儿子
55 Tree tree_predecessor(Tree x)
56 {
57     if (x->left_child != null)
58         return tree_maxmum(x->left_child);
59
60     Tree y = x->parent;
61     while (y != NULL && x == y->left_child)
62     {
63         x = y;
64         y = y->parent;
65     }
66     return y;
67 }
时间: 2024-12-26 09:03:14

数据结构-二叉查找树的相关文章

数据结构—二叉查找树

查找树是一种数据结构,二叉查找树是按二叉树结构来组织的.可以用链表结构表示,其中每一个结点就是一个对象.结点中包括:key.数据.left.right.p.其中left.right和p分别指向左儿子,右儿子和父结点. 二叉查找树中的关键字总是满足二叉查找树的性质:y是x左子树上的结点,则key[y]≤key[x],如果y是x右子树上的结点,则key[y]≥key[x]. 遍历: 根据二叉查找树的性质,可以用一个递归算法按排列顺序输出树中的所有关键字.这种是中序遍历算法:因为一子树根的关键字在输出

数据结构——二叉查找树

使二叉树成为二叉查找树的性质是,对于树中的每个节点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有关键字值大于X的关键字值.这意味着,该树所有的元素以某种统一的方式排序. 二叉查找树的声明 二叉查找树是一棵特殊的二叉树,二叉查找树中节点的结构与二叉树种节点的结构相同,关键在于可以在二叉查找树上可以执行的操作以及对其进行操作的算法.二叉查找树的声明如下: #ifndef  _Tree_H struct TreeNode; typedef struct TreeNode *Posit

JAVA数据结构--二叉查找树

二叉查找树定义 二叉查找树(英语:Binary Search Tree),也称二叉搜索树.有序二叉树(英语:ordered binary tree),排序二叉树(英语:sorted binary tree),是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值: 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值: 任意节点的左.右子树也分别为二叉查找树: 没有键值相等的节点. 二叉查找树相比于其他数据结构的优势在于查找.插入

Java数据结构-二叉查找树续以及平衡二叉查找树

??前面一篇文章讲到了二叉查找树的实现,其中的插入操作是使用非递归方法实现的,这里再增加一种递归实现插入的操作,Java代码如下,建议增加到前一篇文章对应的FOBinarySearchTree.java中: /** * @TODO 二叉排序树插入元素(递归方法) * @param e 需要插入的元素 * @return true or false */ public boolean insert(E e){ insert(root,e); return true; } /** * @TODO 二

数据结构--二叉查找树的java实现

上代码: package com.itany.erchachazhaoshu; public class BinarySearchTree<T extends Comparable<? super T>> { //定义二叉查找树的根节点 每一个查找二叉树都有一个自己的root 节点 root外界看不到 private BinaryNode<T> root; public BinarySearchTree() { root=null; } //节点类 private st

C++数据结构====二叉查找树

C++二叉查找树:Binary Search tree 二叉查找树默认左子树的值都比根节点小,右子树都比根节点大,这个定义排除了树中存在值相同节点的可能性.这便是二叉查找树称为一个用关键值KEY快速查找的工具. 二叉树类: class bst { struct Node { T data; Node* L; Node* R; Node(const T& d):data(d),L(),R(){} Node(const T& d,Node* L,Node* R):data(d),L(L),R(

数据结构|-二叉查找树(二叉搜索树)的链式存储结构的实现

二叉排序树,又称为二叉查找树. 它或者是一棵空树,或者是具有下列性质的二叉树. 若它的左子树不为空,则左子树上所有的结点的值均小于根结构的值: 若它的右子树不为空,则右字数上所有结点的值均大于它的根结点的值: 它的左右子树也分别为二叉排序树. 优点: 1,排序方便 2,方便查找 3,方便插入和删除 二叉排序树的插入数据: 因为二叉排序树中所有的数都符合排序树的特点,所以任意插入一个数时,都能在遍历树的过程中找到其应该放置的正确位置 二叉排序树的删除数据: 三种情况: 1,叶子结点:直接删除该叶子

详解二叉查找树(BST)

详解二叉查找树(BST) 本篇随笔简单讲解一下数据结构--二叉查找树(\(Binary\,\,Sort\,\,Tree,BST\)),(后文的"二叉查找树"一词均用\(BST\)代替). BST的概念 首先,\(BST\)是一棵二叉树. 它的定义是,根节点左子树全部严格小于根节点,右子树大于等于根节点,并且,左右子树都是\(BST\). 很好理解,很明朗很简单的定义. 可以看出,这是一个通过递归方式定义的数据结构,所以,它的诸多操作自然要用到递归. BST的功能 我们可以看出来,这个二

查找与二叉树

查找与二叉树 我家园子有几棵树系列 查找与二叉树 我家园子有几棵树系列 Preface 查找 二叉查找树的实现 定义数据结构 中序遍历 查找操作 插入 删除 删除最小值 复制(拷贝)删除 步骤 Rank 2-3查找树 总结 Preface 前面我们学习了基于线性表的数据结构,如数组,链表,队列,栈等.现在我们要开始学习一种非线性的数据结构--树(tree),是不是很兴奋呢!让我们开始新的系列吧! 查找 先让我们回忆一下线性表的查找,首先最暴力的方法就是做一个线性扫描,一一对比是不是要找的值.这么