二叉树学习二:二叉搜索树

  二叉搜索树(Binary Search Tree),或者是一棵空树,或者:

  1)若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

  2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

  3)二叉搜索树的左、右子树也分别为二叉搜索树。

  搜索二叉树相关的算法实现:

  1)搜索二叉树的创建与转化为双链表实现:

 1 #include "stdafx.h"
 2 #include<iostream>
 3 using namespace std;
 4
 5 /*二无查找树结构定义*/
 6 typedef struct BSTreeNode
 7 {
 8     int m_nValue;
 9     BSTreeNode *m_pLeft;
10     BSTreeNode *m_pRight;
11
12 }BSTreeNode, *BSTree;
13
14 BSTreeNode *m_pHead = NULL;//指向循环队列头结点
15 BSTreeNode *m_pPre = NULL;//指向前一个结点
16
17 void addBSTreeNode(BSTreeNode *&m_pRoot, int value);
18 void inOrderBSTree(BSTreeNode *m_pRoot);
19 void covertBSTree(BSTreeNode *m_pRoot);
20
21 /****************创建二叉搜索树*****************/
22 void addBSTreeNode(BSTreeNode *&m_pRoot, int value){
23     if (m_pRoot == NULL)
24     {
25         BSTreeNode *m_pBSTree = new BSTreeNode();
26         m_pBSTree->m_nValue = value;
27         m_pBSTree->m_pLeft = NULL;
28         m_pBSTree->m_pRight = NULL;
29         m_pRoot = m_pBSTree;
30     }
31     else if (m_pRoot->m_nValue<value)
32     {
33         addBSTreeNode(m_pRoot->m_pRight, value);
34     }
35     else if (m_pRoot->m_nValue>value)
36     {
37         addBSTreeNode(m_pRoot->m_pLeft, value);
38     }
39 }
40
41 /****************中序遍历二叉搜索树*****************/
42 void inOrderBSTree(BSTreeNode *m_pRoot)
43 {
44     if (NULL == m_pRoot)
45     {
46         return;
47     }
48     if (NULL != m_pRoot->m_pLeft)
49     {
50         inOrderBSTree(m_pRoot->m_pLeft);
51     }
52     covertBSTree(m_pRoot);
53     if (NULL != m_pRoot->m_pRight)
54     {
55         inOrderBSTree(m_pRoot->m_pRight);
56     }
57 }
58
59 /****************调整指针位置*****************/
60 void covertBSTree(BSTreeNode *m_pRoot)
61 {
62     m_pRoot->m_pLeft = m_pPre;  //使当前结点的左指针指向双向链表中最后一个结点
63     if (NULL == m_pPre)
64     {
65         m_pHead = m_pRoot;
66     }
67     else
68     {
69         m_pPre->m_pRight = m_pRoot;
70     }
71     m_pPre = m_pRoot;
72     cout << m_pRoot->m_nValue << "\t";
73 }
74
75 int main()
76 {
77     BSTreeNode *m_pRoot = NULL;
78     addBSTreeNode(m_pRoot, 10);
79     addBSTreeNode(m_pRoot, 7);
80     addBSTreeNode(m_pRoot, 15);
81     addBSTreeNode(m_pRoot, 5);
82     addBSTreeNode(m_pRoot, 9);
83     addBSTreeNode(m_pRoot, 12);
84     addBSTreeNode(m_pRoot, 1);
85     inOrderBSTree(m_pRoot);
86     return 0;
87 }

  2)判断一个数组是否为一个二叉搜索树实现:

 1 #include "stdafx.h"
 2 #include<iostream>
 3 using namespace std;
 4
 5 bool VertBST(int Arr[], int length)
 6 {
 7     if (Arr == NULL || length <= 0)
 8     {
 9         return false;
10     }
11     int root = Arr[length - 1];
12     //在左子树中查找小于根节点
13     int i = 0;
14     for (; i < length - 1; ++i)
15     {
16         if (Arr[i]>root)
17         {
18             break;
19         }
20     }
21     //在右子树中查找大于根结点
22     int j = i;
23     for (; j < length-1; ++j)
24     {
25         if (Arr[j]<root)
26         {
27             return false;
28         }
29     }
30     //判断左子树是不是二叉搜索树
31     bool left = true;
32     if (i>0)
33     {
34         left = VertBST(Arr, i);
35     }
36     //判断右子树是不是二叉搜索树
37     bool right = true;
38     if (i<length-1)
39     {
40         right = VertBST(Arr + i, length - i - 1);
41     }
42     return(left&&right);
43 }
44 void main()
45 {
46     int a[7] = {3, 6, 5, 4, 11, 9, 8};
47     bool result;
48     result = VertBST(a, 7);
49     cout << result << endl;
50 }

  对二叉搜索树的优化一般采用平衡二叉树实现。

时间: 2024-11-01 20:09:56

二叉树学习二:二叉搜索树的相关文章

数据结构学习笔记04树(二叉树、二叉搜索树、平衡二叉树)

一.树 树的基本术语 ①结点的度(Degree):结点的子树个数 ②树的度:树的所有结点中最大的度数 ③叶结点(Leaf):度为0的结点 ④父结点(Parent):有子树的结点是其子树的根结点的父结点 ⑤子结点(Child):若A结点是B结点的父结点,则称B结点是A结点的子结点:子结点也称孩子结点. ⑥兄弟结点(Sibling):具有同一父结点的各结点彼此是兄弟结点. ⑦路径和路径长度:从结点n1到nk的路径为一个结点序列n1 , n2 ,… , nk , ni是 ni+1的父结点.路径所包含边

【算法导论学习-24】二叉树专题2:二叉搜索树(Binary Search Tree,BST)

一.   二叉搜索树(Binary SearchTree,BST) 对应<算法导论>第12章.相比一般二叉树,BST满足唯一的条件:任意节点的key>左孩子的key,同时<右孩子的key. 1.     节点类: public class BinarySearchTreesNode<T> { private int key; private T satelliteData; private BinarySearchTreesNode<T> parent, l

【算法导论】学习笔记——第12章 二叉搜索树

搜索树数据结构支持多种动态集合操作,包括SEARCH.MINIMUM.MAXIMUM.PREDECESSOR.SUCCESSOR.INSRT和DELETE操作等.基本的搜索树就是一棵二叉搜索树.12.1 什么是二叉搜索树1. 二叉搜索树的性质:设x是二叉搜索树中的一个结点.如果y是x左子树中的一个结点,那么y.key<=x.key.如果y是x右子树中的一个结点,那么y.key>=x.key.三种遍历时间复杂度是O(n),这是显然的. 12.1-3 1 void Inorder_Tree_Wal

数据结构(三):非线性逻辑结构-特殊的二叉树结构:堆、哈夫曼树、二叉搜索树、平衡二叉搜索树、红黑树、线索二叉树

在上一篇数据结构的博文<数据结构(三):非线性逻辑结构-二叉树>中已经对二叉树的概念.遍历等基本的概念和操作进行了介绍.本篇博文主要介绍几个特殊的二叉树,堆.哈夫曼树.二叉搜索树.平衡二叉搜索树.红黑树.线索二叉树,它们在解决实际问题中有着非常重要的应用.本文主要从概念和一些基本操作上进行分类和总结. 一.概念总揽 (1) 堆 堆(heap order)是一种特殊的表,如果将它看做是一颗完全二叉树的层次序列,那么它具有如下的性质:每个节点的值都不大于其孩子的值,或每个节点的值都不小于其孩子的值

数据结构第三部分:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算

参考:浙大数据结构(陈越.何钦铭)课件 1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找——方法一:顺序查找(时间复杂度O(n)) int

PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由

<pre class="code"><span style="font-family: %value; font-size: 14px;">03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. Input Specification: Each inpu

二叉树的层次遍历(队列) and 二叉搜索树的后序遍历序列

(一)从上往下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印.[层次遍历] 从上到下打印二叉树的规律:每一次打印一个节点的时候,如果该节点有子节点,则把该节点的子节点放到一个队列的末尾.接下来到队列的头部取出最早进入队列的节点,重复前面的操作,直至队列中所有的节点都被打印出来为止. //二叉树的层次遍历#include<iostream>#include<queue>using namespace std; typedef int ElemType;typedef st

二叉树、二叉搜索树、AVL树的java实现

数据结构一直都是断断续续的看,总是觉得理解的不够深入,特别是对树的理解,一直都很浅显,今儿又看了一遍,来做个总结吧. 首先,树中的一些概念: 1.树的节点包含一个数据元素,以及若干指向其子树的分支.节点拥有的子树的数量称为节点的度.节点的最大层次称为树的深度或高度. 2.二叉树是一种树形结构,其特点是每个节点至多有两棵子树,且子树有左右之分,次序不能随意颠倒. 3.满二叉树:一棵深度为k且有2^k - 1个节点的二叉树,称之为满二叉树. 4.完全二叉树:对一个深度为k,节点个数为n的二叉树,当且

树, 二叉树, 二叉搜索树

转载:Vamei   出处:http://www.cnblogs.com/vamei 树的特征和定义 树(Tree)是元素的集合.我们先以比较直观的方式介绍树.下面的数据结构是一个树: 树有多个节点(node),用以储存元素.某些节点之间存在一定的关系,用连线表示,连线称为边(edge).边的上端节点称为父节点,下端称为子节点.树像是一个不断分叉的树根. 每个节点可以有多个子节点(children),而该节点是相应子节点的父节点(parent).比如说,3,5是6的子节点,6是3,5的父节点:1