#ifndef __TREE_H
#define __TREE_H
#include <iostream> template<typename T> class TreeNode {
private:
T _data;
TreeNode<T>* _left;
TreeNode<T>* _right;
TreeNode<T>* _parent;
public:
TreeNode(T data,
TreeNode<T>* parent=,
TreeNode<T>* left=,
TreeNode<T>* right=)
:_data(data),_parent(parent),_left(left),_right(right) {}
void insertAtLeft(T data);
void insertAtRight(T data);
T& getData();
TreeNode<T>*& getLeft();
TreeNode<T>*& getRight();
TreeNode<T>*& getParent();
}; template<typename T>
T& TreeNode<T>::getData()
{
return _data;
} template<typename T>
TreeNode<T>*& TreeNode<T>::getLeft()
{
return _left;
} template<typename T>
TreeNode<T>*& TreeNode<T>::getRight()
{
return _right;
} template<typename T>
TreeNode<T>*& TreeNode<T>::getParent()
{
return _parent;
} template<typename T>
void TreeNode<T>::insertAtLeft(T data)
{
_left = new TreeNode(data,this);
} template<typename T>
void TreeNode<T>::insertAtRight(T data)
{
_right = new TreeNode(data,this);
} template <typename T> class Tree{
private:
TreeNode<T>* _root;
int _size;
protected:
TreeNode<T>* findIn(TreeNode<T>* position,T element) const;
/*
* The last tmp argument is necessary,
* it is used here to changed the parent's _left/_right field
* to potint the node which is created
*/
TreeNode<T>* insertIn(TreeNode<T>* position,
T element,TreeNode<T>* tmp);
void travIn(TreeNode<T>* position);
void travPrev(TreeNode<T>* position);
void travPost(TreeNode<T>* position);
public:
Tree(T data)
:_root(new TreeNode<T> (data)),_size() { }
TreeNode<T>* find(T element) const;
TreeNode<T>* findMax() const;
TreeNode<T>* findMin() const;
TreeNode<T>* insert(T data);
void traversalIn();
void traversalPrev();
void traversalPost();
}; template<typename T>
void Tree<T>::travIn(TreeNode<T>* position)
{
if(!position)
return ;
travIn(position->getLeft());
std::cout << position->getData() << " ";
travIn(position->getRight());
} template<typename T>
void Tree<T>::travPrev(TreeNode<T>* position)
{
if(!position)
return ;
std::cout << position->getData() << " ";
travPrev(position->getLeft());
travPrev(position->getRight());
} template<typename T>
void Tree<T>::travPost(TreeNode<T>* position)
{
if(!position)
return ;
travPost(position->getLeft());
travPost(position->getRight());
std::cout << position->getData() << " ";
} template<typename T>
void Tree<T>::traversalPost()
{
travPost(_root);
std::cout << std::endl;
} template<typename T>
void Tree<T>::traversalPrev()
{
travPrev(_root);
std::cout << std::endl;
} template<typename T>
void Tree<T>::traversalIn()
{
travIn(_root);
std::cout << std::endl;
} template<typename T>
TreeNode<T>* Tree<T>::insertIn(TreeNode<T>* position,T data,
TreeNode<T>* tmp)
{
if(!position){
if(!tmp)
return new TreeNode<T>(data);
else
return (tmp->getData() >data ? tmp->getLeft():tmp->getRight())
= new TreeNode<T>(data,tmp);
}
if(data < position->getData())
insertIn(position->getLeft(),data,position);
else if(position->getData() < data)
insertIn(position->getRight(),data,position);
else
return position;
}
template<typename T>
TreeNode<T>* Tree<T>::insert(T data)
{
return insertIn(_root,data,);
} template<typename T>
TreeNode<T>* Tree<T>::findIn(TreeNode<T>* position,T data)const
{
while(position && position->getData() != data)
{
if(position->getData() > data)
position = position->getLeft();
else if(position->getData() < data)
position = position->getRight();
}
return position;
} template<typename T>
TreeNode<T>* Tree<T>::find(T data) const
{
return findIn(_root,data);
} template<typename T>
TreeNode<T>* Tree<T>::findMax() const
{
TreeNode<T>* tmp = _root;
while(tmp->getRight())
tmp = tmp->getRight();
return tmp;
} template<typename T>
TreeNode<T>* Tree<T>::findMin() const
{
TreeNode<T>* tmp = _root;
while(tmp->getLeft())
tmp = tmp->getLeft();
return tmp;
} #endif

二叉搜索树

Binary search tree的更多相关文章

  1. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  2. Leetcode 笔记 99 - Recover Binary Search Tree

    题目链接:Recover Binary Search Tree | LeetCode OJ Two elements of a binary search tree (BST) are swapped ...

  3. Leetcode 笔记 98 - Validate Binary Search Tree

    题目链接:Validate Binary Search Tree | LeetCode OJ Given a binary tree, determine if it is a valid binar ...

  4. Leetcode: Convert sorted list to binary search tree (No. 109)

    Sept. 22, 2015 学一道算法题, 经常回顾一下. 第二次重温, 决定增加一些图片, 帮助自己记忆. 在网上找他人的资料, 不如自己动手. 把从底向上树的算法搞通俗一些. 先做一个例子: 9 ...

  5. [LeetCode] Closest Binary Search Tree Value II 最近的二分搜索树的值之二

    Given a non-empty binary search tree and a target value, find k values in the BST that are closest t ...

  6. [LeetCode] Closest Binary Search Tree Value 最近的二分搜索树的值

    Given a non-empty binary search tree and a target value, find the value in the BST that is closest t ...

  7. [LeetCode] Verify Preorder Sequence in Binary Search Tree 验证二叉搜索树的先序序列

    Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary ...

  8. [LeetCode] Lowest Common Ancestor of a Binary Search Tree 二叉搜索树的最小共同父节点

    Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...

  9. [LeetCode] Binary Search Tree Iterator 二叉搜索树迭代器

    Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ro ...

  10. [LeetCode] Convert Sorted List to Binary Search Tree 将有序链表转为二叉搜索树

    Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...

随机推荐

  1. HTML学习总结

    首先,我们要问,什么是html?官方的解释是:超文本标记语言.什么意思呢?简单的来说,就是一种用来制作网页的特殊语言.那么,什么是网页呢?我们说,网页是一个在浏览器窗口下显示的页面,实质上是一个文档. ...

  2. NotSerializableException解决方法

    NotSerializableException 问题描述: 想要写入对象的时候的时候回抛出NotSerializableException:类名 原因: 写入的对象没有序列化,即没有实现java.i ...

  3. 玩转Docker之安装篇(二)

    按理说,安装软件最好是按照官方文档进行,但由于国内网络的局限性,使我们不得不搭梯子,但终究太麻烦.鉴于此情况,我推荐方案一,利用某公司的加速站点来安装,而且是傻瓜式的,非常方便. 方案一: 在linu ...

  4. Hyhyhy – 专业的 HTML5 演示文稿工具

    Hyhyhy 是创建好看的 HTML5 演示文档的工具.它具备很多的特点:支持 Markdown,嵌套幻灯片,数学排版,兼容性,语法高亮,使用 Javascript API ,方便的骨架.它支持 Fi ...

  5. 微信中a链接无法进行跳转

    [问题]微信页面开发时,各个主页之间的跳转,完全是通过a链接进行的,但是来回跳转几次,再次从其他主页面跳回首页的时候,微信头部出现了跳转加载进度条,但是就是不跳转,也没有任何反应 [范围]只出现在微信 ...

  6. 【追寻javascript高手之路02】变量、作用域知多少?

    前言 本来想把这个与上篇博客写到一起的,但是考虑到是两个知识点还是分开算了,于是我们继续今天的学习吧. 基本类型与引用类型 ECMAScript的的变量有两种类型: 基本类型(值类型):简单数据段 引 ...

  7. Office 365 - SharePoint 2013 Online 中使用Windows PowerShell

    1.如果想要在SharePoint Online中使用Windows PowerShell,首先需要安装SharePoint Online Management Shell(下载地址附后),如下图: ...

  8. git 设置 key 到服务器,同步代码不需要输入用户名和密码

    1  ssh-keygen -t rsa 2  vim ~/.ssh/id_rsa.pub 3. 添加到git 服务器,这样同步代码就不需要输入密码

  9. Ubuntu Server 14.04升级Ubuntu Server 16.04

    Ubuntu Server 14.04升级Ubuntu Server 16.04 :转 http://blog.csdn.net/chszs 1.终端下执行命令 $ sudo apt-get upda ...

  10. System.currentTimeMillis()与SystemClock.uptimeMillis()

    1.System.currentTimeMillis()获取的是系统的时间,可以使用SystemClock.setCurrentTimeMillis(long millis)进行设置.如果使用Syst ...