二叉查找树按照二叉树进行组织。二叉查找树关键字的存储方式总是瞒住二叉查找树性质:
设x为二查查找树种一个节点。如果y是x的左子树中的一个节点,那么key[x] >= key[y]。如果y是x的右子树的一个节点,那么key[x] <= key[y]。
这样对二叉查找树进行中序遍历就可得到书中所有元素的一个非降序排列。
查找某一个存在节点的前驱和后继。某一个节点x的后继就是大于key[x]的关键字中最小的那个节点,前驱就是小于key[x]的关键字中最大的那个节点。查找二叉前驱和后继节点的算法如下所示:
- typedef struct _node {
- struct _node *left_child;
- struct _node *right_child;
- struct _node * parent;
- ctype data;
- }node;
-
- typedef node* Tree;
-
-
- Tree tree_minimum(Tree root)
- {
- Tree p = root;
- while (p->left_child != null)
- p = p->left_child;
- return p;
- }
-
-
- Tree tree_maxmum(Tree root)
- {
- Tree p = root;
-
- while (p->right_child != null)
- {
- p = p->right_child;
- }
- return p;
- }
-
-
-
-
- Tree tree_successor(Tree x)
- {
- if (x->right_child != null)
- return tree_minimum(x->right_child);
-
-
-
- Tree y = x->parent;
-
- while (y != NULL && x == y->right_child)
- {
- x = y;
- y = y->parent;
- }
- return y;
- }
-
-
-
-
-
- Tree tree_predecessor(Tree x)
- {
- if (x->left_child != null)
- return tree_maxmum(x->left_child);
-
- Tree y = x->parent;
- while (y != NULL && x == y->left_child)
- {
- x = y;
- y = y->parent;
- }
- return y;
- }
阅读(3550) | 评论(0) | 转发(0) |