Binary search tree
#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的更多相关文章
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- Leetcode 笔记 99 - Recover Binary Search Tree
题目链接:Recover Binary Search Tree | LeetCode OJ Two elements of a binary search tree (BST) are swapped ...
- Leetcode 笔记 98 - Validate Binary Search Tree
题目链接:Validate Binary Search Tree | LeetCode OJ Given a binary tree, determine if it is a valid binar ...
- Leetcode: Convert sorted list to binary search tree (No. 109)
Sept. 22, 2015 学一道算法题, 经常回顾一下. 第二次重温, 决定增加一些图片, 帮助自己记忆. 在网上找他人的资料, 不如自己动手. 把从底向上树的算法搞通俗一些. 先做一个例子: 9 ...
- [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 ...
- [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 ...
- [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 ...
- [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 ...
- [LeetCode] Binary Search Tree Iterator 二叉搜索树迭代器
Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ro ...
- [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 ...
随机推荐
- LBS数据分析:使用地图展示统计数据——麻点图与麻数图
作为一个LBS的APP,都获得了用户经纬度,也都使用了友盟统计.google ana等等统计分析系统,不过没有地图展示功能,不能进行直观的展示. 友盟统计.google ana等系统是总体数据统计,无 ...
- 网站开发中很实用的 HTML5 & jQuery 插件
这篇文章挑选了15款在网站开发中很实用的 HTML5 & jQuery 插件,如果你正在寻找能优化网站,使其更具创造力和视觉冲击,那么本文正是你需要的.这些优秀的 jQuery 插件能为你的网 ...
- Droidicon – 1600+ 漂亮的 Android 图标
Droidicon 提供超过1600款定制图标,让你可以超级容易的把图标和徽章添加到您的应用程序中.你可以自定义你想要的各种形式的图标,给图标添加描边,透明度和颜色过滤器.包括这些 Google Ma ...
- 20款时尚的 WordPress 企业模板【免费主题下载】
在这篇文章中,我们收集了20款时尚的 WordPress 企业模板.WordPress 作为最流行的博客系统,插件众多,易于扩充功能.安装和使用都非常方便,而且有许多第三方开发的免费模板,安装方式简单 ...
- [deviceone开发]-cnodejs论坛移动端App
一. 简介 这个App是利用cnodejs.net的API来实现论坛的移动端,使用了deviceone的官方的js库(github.com/do-js). 从而使代码非常简洁,便于阅读和参考,值得推荐 ...
- ae 打开地图文档
if (openMxdDialog.ShowDialog() == DialogResult.OK) { pathMXD = openMxdDialog.FileName; if (pathMXD ! ...
- [javascript svg fill stroke stroke-width points polygon属性讲解] svg fill stroke stroke-width points polygon绘制多边形属性并且演示polyline和polygon区别讲解
<!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...
- 关于Android 的内存泄露及分析
一. Android的内存机制Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似.程序员通过new为对象分配内存,所有对象在java堆内分配空间:然而对象的释 ...
- Android提交数据到JavaWeb服务器实现登录
之前学习Android提交数据到php服务器没有成功,在看了两三个星期的视频之后,现在终于实现了与服务器的交互.虽然完成的不是PHP端的,但是在这个过程还是学到了不少东西的.现在我先来展示一下我的成果 ...
- 【代码笔记】iOS-电影上的花絮,自动滚动
一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...