1、完全二叉树
若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。完全二叉树是由满二叉树而引出来的。对于深度为K的,有N个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。若一棵二叉树至多只有最下面的两层上的结点的度数可以小于2,并且最下层上的结点都集中在该层最左边的若干位置上,则此二叉树成为完全二叉树。
2、二叉查找树(二叉排序树 Binary Search Tree)
二叉排序树(Binary Sort Tree)又称二叉查找树。 它或者是一棵空树;或者是具有下列性质的二叉树:1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树;
二叉排序树是一种动态树表。其特点是:树的结构通常不是一次生成的,而是在查找过程中,当树中不存在关键字等于给定值的节点时再进行插入。新插入的结点一定是一个新添加的叶子节点,并且是查找不成功时查找路径上访问的最后一个结点的左孩子或右孩子结点。
在二叉排序树删去一个结点,分三种情况讨论:
若*p结点为叶子结点,即PL(左子树)和PR(右子树)均为空树。由于删去叶子结点不破坏整棵树的结构,则只需修改其双亲结点的指针即可。若*p结点只有左子树PL或右子树PR,此时只要令PL或PR直接成为其双亲结点*f的左子树(当*p是左子树)或右子树(当*p是右子树)即可,作此修改也不破坏二叉排序树的特性。若*p结点的左子树和右子树均不空。在删去*p之后,为保持其它元素之间的相对位置不变,可按中序遍历保持有序进行调整,可以有两种做法:其一是令*p的左子树的最右下节点代替*p,并删除*p的最又下节点;其二是令*p的直接前驱(或直接后继)替代*p,然后再从二叉排序树中删去它的直接前驱(或直接后继)。
#ifndef BinarySearchTree_H
#define BinarySearchTree_H
#include <stack>
using namespace std;
template<typename T>
class TreeNode
{
public:
T value; // value contained in the node
TreeNode<T> * parent; // Pointer to the parent
TreeNode<T> * left; // Pointer to the left child
TreeNode<T> * right; // Pointer to the right child
TreeNode() // No-arg constructor
{
left = NULL;
right = NULL;
parent = NULL;
}
TreeNode(T value) // Constructor
{
this->value = value;
left = NULL;
right = NULL;
parent = NULL;
}
};
template < typename T >
class BinarySearchTree
{
public:
int treeSize;
BinarySearchTree();
BinarySearchTree(T values[],int arraySize);
int insert(T value);
void inOrder();
void inOrderNorRec();
int deleteNode(T value);
int successor(T value);
int predecessor(T value);
void maxValue();
void minValue();
int getSize(T value);
void output();
private:
TreeNode<T> * treeroot;
void inOrder(TreeNode<T> *target);
void inOrderNorRec(TreeNode<T> *target);
TreeNode<T> * search(T searchvalue);
int deleteNode(TreeNode<T> *delNode);
TreeNode<T> * successor(TreeNode<T> *target);
TreeNode<T> * predecessor(TreeNode<T> *target);
TreeNode<T> * maxValue(TreeNode<T> *target);
TreeNode<T> * minValue(TreeNode<T> *target);
int getSize(TreeNode<T> *target);
void output(TreeNode<T> *target,int totalSpaces);
};
template < typename T >
BinarySearchTree<T>::BinarySearchTree()
{
treeroot = NULL;
treeSize = 0;
}
template < typename T >
BinarySearchTree<T>::BinarySearchTree(T values[],int arraySize)
{
treeroot = NULL;
treeSize = 0;
for(int i=0 ; i<arraySize ; i++){
this->insert(values[i]);
}
}
template <typename T>
int BinarySearchTree<T>::insert(T value)
{
if (treeroot == NULL){
treeroot = new TreeNode<T>(value);
}
else
{
TreeNode<T> *former = NULL;
TreeNode<T> *current = treeroot;
while (current != NULL){
if (value < current->value){
former = current;
current = current->left;
}
else if (value > current->value){
former = current;
current = current->right;
}
else{
cout << "Node with value "<< value <<" has existed." <<endl;
return 1;
}
}
if (value < former->value){
TreeNode<T> *newNode=new TreeNode<T>(value);
former->left = newNode;
newNode->parent = former;
}
else if(value > former->value){
TreeNode<T> *newNode=new TreeNode<T>(value);
former->right = newNode;
newNode->parent = former;
}
}
treeSize++;
return 0;
}
template <typename T>
TreeNode<T> * BinarySearchTree<T>::search(T searchvalue)
{
TreeNode<T> *current = treeroot;
int find =0;
while (current != NULL && find == 0){
if (current->value == searchvalue){
find = 1;
}
else if(current->value > searchvalue){
current = current->left;
}else{
current = current->right;
}
}
if (find == 1){
return current;
}else{
return NULL;
}
}
template <typename T>
int BinarySearchTree<T>::deleteNode(T value){
TreeNode<T> *delNode = this->search(value);
if ( delNode == NULL){
cout << "not find " << endl;
return 1;
}
this->deleteNode(delNode);
cout << "Node "<< value <<" has been deleted."<< endl;
return 0;
}
template <typename T>
int BinarySearchTree<T>::deleteNode(TreeNode<T> *delNode){
TreeNode<T> *deleteTarget;
if (delNode->left == NULL && delNode->right == NULL){
deleteTarget = delNode;
}else if(delNode->left !=NULL){
deleteTarget = this->predecessor(delNode);
}else if(delNode->right !=NULL){
deleteTarget = this->successor(delNode);
}
TreeNode<T> *deleteTargetChild = NULL;
if (deleteTarget->left != NULL){
deleteTargetChild = deleteTarget->left;
}else if (deleteTarget->right != NULL){
deleteTargetChild = deleteTarget->right;
}
if (deleteTargetChild != NULL){
deleteTargetChild->parent = deleteTarget->parent;
}
if (deleteTarget->parent == NULL){
treeroot = deleteTargetChild;
deleteTargetChild->parent = NULL;
}else if ( deleteTarget->parent->left == deleteTarget){
deleteTarget->parent->left = deleteTargetChild;
}else{
deleteTarget->parent->right = deleteTargetChild;
}
if (deleteTarget != delNode){
delNode->value = deleteTarget->value;
}
treeSize--;
return 0;
}
template <typename T>
int BinarySearchTree<T>::successor(T value)
{
TreeNode<T> *position = this->search(value);
if ( position == NULL){
cout << "not find " << endl;
return 1;
}
TreeNode<T> *successorNode = this->successor(position);
if ( successorNode != NULL)
cout << value << " \'s successor is:" << successorNode->value << endl;
else
cout << value << " has no successor" << endl;
return 0;
}
template <typename T>
TreeNode<T> * BinarySearchTree<T>::successor(TreeNode<T> *target)
{
if ( target->right != NULL){
return minValue(target->right);
}
TreeNode<T> * parentNode =target->parent;
while ( parentNode != NULL && parentNode->right == target){
target = parentNode;
parentNode = parentNode->parent;
}
return parentNode;
}
template <typename T>
int BinarySearchTree<T>::predecessor(T value)
{
TreeNode<T> *position = this->search(value);
if ( position == NULL){
cout << "not find " << endl;
return 1;
}
TreeNode<T> *predecessorNode = this->predecessor(position);
if ( predecessorNode != NULL)
cout << value << " \'s predecessor is:" << predecessorNode->value << endl;
else
cout << value << " has no predecessor" << endl;
return 0;
}
template <typename T>
TreeNode<T> * BinarySearchTree<T>::predecessor(TreeNode<T> *target)
{
if ( target->left != NULL){
return maxValue(target->left);
}
TreeNode<T> * parentNode =target->parent;
while ( parentNode != NULL && parentNode->left == target){
target = parentNode;
parentNode = parentNode->parent;
}
return parentNode;
}
template <typename T>
void BinarySearchTree<T>::maxValue()
{
TreeNode<T> * max = this->maxValue(treeroot);
cout << "Max Value is :" << max->value << endl;
}
template <typename T>
TreeNode<T> * BinarySearchTree<T>::maxValue(TreeNode<T> *target)
{
while (target -> right != NULL){
target = target -> right;
}
return target;
}
template <typename T>
void BinarySearchTree<T>::minValue()
{
TreeNode<T> * min = this->minValue(treeroot);
cout << "Min Value is :" << min->value << endl;
}
template <typename T>
TreeNode<T> * BinarySearchTree<T>::minValue(TreeNode<T> *target)
{
while (target -> left != NULL){
target = target -> left;
}
return target;
}
template <typename T>
int BinarySearchTree<T>::getSize(T value)
{
TreeNode<T> *target = this->search(value);
return getSize(target);
}
template <typename T>
int BinarySearchTree<T>::getSize(TreeNode<T> *target)
{
if (target == NULL){
return 0;
}
if (target->left == NULL && target->left == NULL){
return 1;
}else {
return this->getSize(target->left) + 1 + this->getSize(target->right);
}
}
template <typename T>
void BinarySearchTree<T>::inOrder()
{
inOrder(treeroot);
}
template <typename T>
void BinarySearchTree<T>::inOrder(TreeNode<T> *target)
{
if (target == NULL)
return ;
inOrder(target->left);
cout << target->value << " ";
inOrder(target->right);
}
template <typename T>
void BinarySearchTree<T>::inOrderNorRec()
{
inOrderNorRec(treeroot);
}
template <typename T>
void BinarySearchTree<T>::inOrderNorRec(TreeNode<T> *target)
{
stack < TreeNode<T> *> s;
while ((target != NULL) || !s.empty())
{
if (target != NULL)
{
s.push(target);
target = target->left;
}
else
{
target = s.top();
cout << target->value << " ";
s.pop();
target = target->right;
}
}
}
template <typename T>
void BinarySearchTree<T>::output()
{
output(treeroot,0);
}
template <typename T>
void BinarySearchTree<T>::output(TreeNode<T> *target,int totalSpaces)
{
if(target != NULL)
{
output(target->right,totalSpaces+4);
for(int i=0;i<totalSpaces;i++){
cout<<' ';
}
if (target->parent != NULL){
cout << target->value << "[" << target->parent->value << "]" << endl;
}
else{
cout << target->value << "[ROOT]" << endl;
}
output(target->left,totalSpaces+4);
}
};
#endif
自己实现的简单二叉查找树的建立和输出
typedef struct BR
{
int data;
struct BR *lchild;
struct BR *rchild;
}Node;
Node *InsertBST(Node **tree,int key)//传递二维指针
{
if(*tree==NULL)
{
(*tree)=new Node;
(*tree)->lchild=(*tree)->rchild=NULL;
(*tree)->data=key;
}
else
{
if ((*tree)->data>key)
{
InsertBST(&(*tree)->lchild,key);
}
else if ((*tree)->data<key)
{
InsertBST(&(*tree)->rchild,key);
}
}
return *tree;
}
void CreateBiTree(Node **tree,int d[],int n)
{
for (int i=0;i<n;i++)
{
InsertBST(tree,d[i]);
}
}
//二叉树的输出,按照从小到大的顺序,此时是中序遍历输出
void PrintBitree(Node *tree)
{
if (tree!=NULL)
{
PrintBitree(tree->lchild);
cout<<tree->data<<endl;
PrintBitree(tree->rchild);
}
else
return;
}
int _tmain(int argc, _TCHAR* argv[])
{
string str="ABCDAK";
int Array[8]={3,7,5,9,4,12,86,15};
string help_str=str;
Node *tree=NULL;
CreateBiTree(&tree,Array,8);
PrintBitree(tree);
int ch=getchar();
return 0;
}