开发手册 欢迎您!
软件开发者资料库

数据结构 - 二叉树搜索

数据结构和算法二进制搜索树 - 使用c,C ++和Java学习数据结构和算法,从简单和简单的步骤开始,从基本到高级概念,包括概述,环境设置,算法,渐近分析,贪婪算法,分而治之,动态编程,数据结构,数组,链表,双链表,循环列表,堆栈,解析表达式,队列,优先级队列,线性,二进制,插值搜索,树,树遍历,二叉搜索树,B +,AVL,跨越,河内塔,哈希表,堆,图,深度,广度第一遍历,搜索技术,排序技术,排序算法,泡沫,合并排序算法,插入,选择,壳,快速排序,递归,斐波那契系列。

二进制搜索树(BST)是一个树,其中所有节点都遵循下面提到的属性 :

  • 节点的左子树有一个小于或等于其父节点密钥的密钥.

  • 节点的右子树有一个大于其父节点键的键.

因此,BST将其所有子树划分为两个段;左子树和右子树可以定义为 :

left_subtree (keys)  ≤  node (key)  ≤  right_subtree (keys)

表示

BST是以维护BST属性的方式排列的节点集合.每个节点都有一个密钥和一个相关的值.在搜索时,将所需的键与BST中的键进行比较,如果找到,则检索相关值.

以下是BST的图示表示 :

二进制搜索树

我们观察到根节点密钥(27)具有所有值较小的密钥左侧子树和右侧子树上的高值键.

基本操作

以下是树的基本操作 :

  • 搜索 : 搜索树中的元素.

  • 插入 : 在树中插入元素.

  • 预订遍历 : 以预购方式遍历树.

  • 按顺序遍历 : 按顺序遍历树.

  • 订购后遍历 : 以后序方式遍历树.

节点

定义一个有一些节点的节点数据,对其左右子节点的引用.

struct node {   int data;      struct node *leftChild;   struct node *rightChild;};

搜索操作

每当要搜索元素时,从根节点开始搜索.然后,如果数据小于键值,则搜索左子树中的元素.否则,搜索右子树中的元素.对每个节点遵循相同的算法.

算法

struct node* search(int data){   struct node *current = root;   printf("Visiting elements: ");   while(current->data != data){      if(current != NULL) {         printf("%d ",current->data);         //go to left tree         if(current->data > data){            current = current->leftChild;         }  //else go to right tree         else {                            current = current->rightChild;         }         //not found         if(current == NULL){            return NULL;         }      }   }      return current;}

插入操作

每当要插入元素时,首先找到其正确的位置.从根节点开始搜索,然后如果数据小于键值,则在左子树中搜索空位置并插入数据.否则,搜索右子树中的空位置并插入数据.

算法

void insert(int data) {   struct node *tempNode = (struct node*) malloc(sizeof(struct node));   struct node *current;   struct node *parent;   tempNode->data = data;   tempNode->leftChild = NULL;   tempNode->rightChild = NULL;   //if tree is empty   if(root == NULL) {      root = tempNode;   } else {      current = root;      parent = NULL;      while(1) {                         parent = current;         //go to left of the tree         if(data < parent->data) {            current = current->leftChild;                            //insert to the left            if(current == NULL) {               parent->leftChild = tempNode;               return;            }         }  //go to right of the tree         else {            current = current->rightChild;                        //insert to the right            if(current == NULL) {               parent->rightChild = tempNode;               return;            }         }      }               }}