# 数据结构基础 之 二叉搜索树的思想与实现

【摘要】

【正文】

AVL树、红黑树、Size Balanced Tree(SBT)、Treap(Tree+Heap)这些均可以使查找树的高度为O(log(n))。

【二叉搜索树的创建与遍历源码】

#include <iostream>
using namespace std;
//树结点类的实现
template<class Elem>
class TreeNode
{
public:
<span style="white-space:pre">	</span>TreeNode(Elem dataVal,TreeNode* leftVal     = NULL,TreeNode* rightVal     = NULL)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>data     = dataVal;
<span style="white-space:pre">		</span>left     = leftVal;
<span style="white-space:pre">		</span>right     = rightVal;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>TreeNode(TreeNode* leftVal     = NULL,TreeNode* rightVal     = NULL)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>left     = leftVal;
<span style="white-space:pre">		</span>right     = rightVal;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>TreeNode* GetLeft()
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>return left;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>TreeNode* GetRight()
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>return right;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>Elem GetVal()
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>return data;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>void SetVal(Elem it)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>data     = it;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>void SetLeft(TreeNode<Elem>* l)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>left     = l;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>void SetRight(TreeNode<Elem>* r)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>right     = r;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>TreeNode* left;
<span style="white-space:pre">	</span>TreeNode* right;
<span style="white-space:pre">	</span>Elem data;
};
//树的类型实现。
template<class Elem>
class SearchTree
{
public:
<span style="white-space:pre">	</span>SearchTree(Elem it)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>init(it);
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>~SearchTree()
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>DeleteTree(root);
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>void init(Elem);
<span style="white-space:pre">	</span>void DeleteTree(TreeNode<Elem>*);
<span style="white-space:pre">	</span>void InsertNode(TreeNode<Elem>*,Elem item);
<span style="white-space:pre">	</span>void PreOrder(TreeNode<Elem>*);
<span style="white-space:pre">	</span>bool Find(TreeNode<Elem>*,Elem);
<span style="white-space:pre">	</span>TreeNode<Elem>* GetRoot()
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>return root;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>void InOrder(TreeNode<Elem>* T);
<span style="white-space:pre">	</span>void PostOrder(TreeNode<Elem>* T);
private:
<span style="white-space:pre">	</span>TreeNode<Elem>* root;
};
template<class Elem>
void SearchTree<Elem>::init(Elem item)
{
<span style="white-space:pre">	</span>root     = new TreeNode<Elem>(item,NULL,NULL);
}
template<class Elem>
void SearchTree<Elem>::DeleteTree(TreeNode<Elem>* T)
{
<span style="white-space:pre">	</span>if(T!     = NULL)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>DeleteTree(T->GetLeft());
<span style="white-space:pre">		</span>DeleteTree(T->GetRight());
<span style="white-space:pre">		</span>delete T;
<span style="white-space:pre">	</span>}
}
//插入结点。
template<class Elem>
void SearchTree<Elem>::InsertNode(TreeNode<Elem>* T,Elem item)
{
<span style="white-space:pre">	</span>TreeNode<Elem>* pointer     = NULL;
<span style="white-space:pre">	</span>if(T     =     = NULL)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>init(item);
<span style="white-space:pre">		</span>return;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>else pointer     = T;
<span style="white-space:pre">	</span>while(1)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>if(pointer->GetVal()     =     = item)
<span style="white-space:pre">			</span>return;
<span style="white-space:pre">		</span>else
<span style="white-space:pre">			</span>if(pointer->GetVal()>item)
<span style="white-space:pre">			</span>{
<span style="white-space:pre">				</span>if(pointer->GetLeft()     =     = NULL)
<span style="white-space:pre">				</span>{
<span style="white-space:pre">					</span>pointer->left     = new TreeNode<Elem>(item,NULL,NULL);
<span style="white-space:pre">					</span>return;
<span style="white-space:pre">				</span>}
<span style="white-space:pre">				</span>else
<span style="white-space:pre">					</span>pointer     = pointer->left;
<span style="white-space:pre">			</span>}
<span style="white-space:pre">			</span>else
<span style="white-space:pre">			</span>{
<span style="white-space:pre">				</span>if(pointer->GetRight()     =     = NULL)
<span style="white-space:pre">				</span>{
<span style="white-space:pre">					</span>pointer->right     = new TreeNode<Elem>(item,NULL,NULL);
<span style="white-space:pre">					</span>return;
<span style="white-space:pre">				</span>}
<span style="white-space:pre">				</span>else
<span style="white-space:pre">					</span>pointer     = pointer->right;
<span style="white-space:pre">			</span>}
<span style="white-space:pre">	</span>}
}
//前序递归遍历。
template<class Elem>
void SearchTree<Elem>::PreOrder(TreeNode<Elem>*T)
{
<span style="white-space:pre">	</span>if(T!     = NULL)
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>cout<<T->GetVal()<<" ";
<span style="white-space:pre">			</span>PreOrder(T->GetLeft());
<span style="white-space:pre">			</span>PreOrder(T->GetRight());
<span style="white-space:pre">		</span>}
}
//二叉递归查找
template<class Elem>
bool SearchTree<Elem>::Find(TreeNode<Elem>* T,Elem item)
{
<span style="white-space:pre">	</span>if(T     =     = NULL)
<span style="white-space:pre">		</span>return false;
<span style="white-space:pre">	</span>else if(T->GetVal()>item)
<span style="white-space:pre">		</span>return  Find(T->left,item);
<span style="white-space:pre">	</span>else if(T->GetVal()<item)
<span style="white-space:pre">		</span>return Find(T->right,item);
<span style="white-space:pre">	</span>else
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>item     = T->GetVal();
<span style="white-space:pre">		</span>return true;
<span style="white-space:pre">	</span>}
}
//中序递归遍历。
template<class Elem>
void SearchTree<Elem>::InOrder(TreeNode<Elem>*T)
{
<span style="white-space:pre">	</span>if(T!     = NULL)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>InOrder(T->left);
<span style="white-space:pre">		</span>cout<<T->data<<" ";
<span style="white-space:pre">		</span>InOrder(T->right);
<span style="white-space:pre">	</span>}
}
//后序递归遍历。
template<class Elem>
void SearchTree<Elem>::PostOrder(TreeNode<Elem>* T)
{
<span style="white-space:pre">	</span>if(T!     = NULL)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>PostOrder(T->left);
<span style="white-space:pre">		</span>PostOrder(T->right);
<span style="white-space:pre">		</span>cout<<T->data<<" ";
<span style="white-space:pre">	</span>}
}
int main()
{
<span style="white-space:pre">	</span>SearchTree<char> A('h');//先创建一个根结点。
<span style="white-space:pre">	</span>char it;
<span style="white-space:pre">	</span>char item;
<span style="white-space:pre">	</span>TreeNode<char>* b;
<span style="white-space:pre">	</span>b     = A.GetRoot();
<span style="white-space:pre">	</span>cout<<"insert any number in the tree"<<endl;
<span style="white-space:pre">	</span>cout<<"when you enter '# 'is end!"<<endl;
<span style="white-space:pre">	</span>cin>>item;
<span style="white-space:pre">	</span>while(item!     = '#')
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>A.InsertNode(b,item);    //连续插入结点。
<span style="white-space:pre">		</span>cin>>item;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>cout<<"PreOrder print all the number:";
<span style="white-space:pre">	</span>A.PreOrder(b);
<span style="white-space:pre">	</span>cout<<endl;
<span style="white-space:pre">	</span>cout<<"inorder print:";
<span style="white-space:pre">	</span>A.InOrder(b);
<span style="white-space:pre">	</span>cout<<endl;
<span style="white-space:pre">	</span>cout<<" PostOrder print:";
<span style="white-space:pre">	</span>A.PostOrder(b);
<span style="white-space:pre">	</span>cout<<endl;
<span style="white-space:pre">	</span>cin>>it;
<span style="white-space:pre">	</span>if(A.Find(b,it))
<span style="white-space:pre">		</span>cout<<"there is the same number!";
<span style="white-space:pre">	</span>else
<span style="white-space:pre">		</span>cout<<"there isn't the number!";
<span style="white-space:pre">	</span>return 0;
}

【后序遍历判断是否二叉树】

http://blog.csdn.net/pengyan0812/article/details/46409745

• 本文已收录于以下专栏：

## 冒泡排序（BubbleSort）思想与实现

• disappear_XueChao
• 2017年08月28日 20:02
• 238

## 数据结构基础 之 单链表 各类操作、思想与实现

• u013630349
• 2015年04月06日 20:18
• 693

## 数据结构之 二叉查找树（C语言实现）

• men_wen
• 2017年03月28日 20:42
• 594

## 数据结构—二叉搜索树的创建、结点的插入和删除

• u012258911
• 2015年08月29日 15:52
• 1062

## 二叉查找树的C++实现

• sysu_arui
• 2012年08月21日 18:11
• 2225

## 数据结构与算法基础

1、概论基本概念和术语数据（Data）    　数据是信息的载体。它能够被计算机识别、存储和加工处理，是计算机程序加工的"原料"。    　随着计算机应用领域的扩大，数据的范畴包括：　　整数、实数、字...
• xietangz
• 2005年01月19日 10:20
• 3956

## 简单数据结构实现——二叉查找树

• hhhuuu2020
• 2016年09月20日 01:53
• 155

## 算法和数据结构基础题集（持续更新中）

• hnuzengchao
• 2014年11月04日 23:45
• 934

## 【数据结构排序算法系列】数据结构八大排序算法

• htq__
• 2016年03月25日 22:36
• 94397

## 数据结构(22)--动态查找之二叉排序树（二叉查找树）

• u010366748
• 2016年03月07日 18:23
• 947

举报原因： 您举报文章：数据结构基础 之 二叉搜索树的思想与实现 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)