算法导论第十二章关于搜索二叉树的建立,查询,查找最大最小元素值,查找给定结点的直接后继

来源:互联网 发布:淄博网站搜索优化 编辑:程序博客网 时间:2024/05/01 14:03

最近在苦练C++,看到了算法导论中十二章关于搜索二叉树的讲解

搜索二叉树可用于排序,查找给定元素组的最小最大值元素;

欢迎各位同学交流;

完整程序参考如下::

#include<iostream>
using namespace std;
template<class Type>
class BTree;


template<class Type>
class BNode{
friend class BTree<Type>;
public:
BNode():left(NULL),right(NULL),patrent(NULL){}
BNode(const Type &value):data(value),left(NULL),right(NULL),parent(NULL){}
private:
Type data;
BNode *left;
BNode *right;
BNode *parent;


};


template<class Type>
class BTree{
public:
BTree():root(NULL){}
//获得根结点的指针
BNode<Type> *get_root()const
{
return root;
}
//像二叉树里面添加元素
void add_element(const Type &value);
void inorder_traverse( BNode<Type> *startNode) const;


BNode<Type> *Tree_Search(BNode<Type> *startNode,const Type &value) const;
//查询二叉树里面元素的最小值
BNode<Type>  *search_min(BNode<Type> *startNode1) const;
//查询二叉树里面的最大值
BNode<Type>  *search_max(BNode<Type> *startNode1) const;
//定义一个查找后继的函数
BNode<Type> *tree_successor(BNode<Type> *Node) const;


private:
BNode<Type> *root;
};


template<class Type>
void BTree<Type>::add_element(const Type &value)
{
if(root==NULL)
{
root=new BNode<Type>(value);
}
else
{
BNode<Type>  *node=root;
while(1)
{
if(value>node->data)
{
if(node->right==NULL)
{
node->right=new BNode<Type>(value);
node->right->parent=node;
break;
}
else
{
node=node->right;
}
}
else
{
if(node->left==NULL)
{
node->left=new BNode<Type>(value);
node->left->parent=node;
break;
}
else
{
node=node->left;
}




}
}
}


}
//对二叉树进行中序遍历
template<class Type>
void BTree<Type>::inorder_traverse( BNode<Type> *startNode) const
{
if(startNode==NULL)
{
return;
}
else
{
inorder_traverse(startNode->left);
cout<<startNode->data<<" ";
inorder_traverse(startNode->right);
}
}
//对二叉树进行查找
template<class Type>
BNode<Type> *BTree<Type>::Tree_Search( BNode<Type> *Node,const Type &value) const
{
while(Node!=NULL&&Node->data!=value)
{
if(value>Node->data)
Node=Node->right;
else
{
Node=Node->left;
}
}
cout<<"找到给定的元素值为"<<Node->data<<endl;
return Node;
}
template<class Type>
BNode<Type>  *BTree<Type>::search_min(BNode<Type> *startNode1) const
{
while((startNode1->left)!=NULL)
{
startNode1=startNode1->left;

}
cout<<"二叉树中的最小元素的值为"<<startNode1->data<<endl;
return startNode1;
}
template<class Type>
BNode<Type>  *BTree<Type>::search_max(BNode<Type> *startNode1) const
{
while((startNode1->right)!=NULL)
{
startNode1=startNode1->right;

}
cout<<"二叉树中的最大元素的值为"<<startNode1->data<<endl;
return startNode1;
}
template<class Type>
BNode<Type> *BTree<Type>::tree_successor(BNode<Type> *Node) const
{
if(Node=search_max(get_root()))
{cout<<"没有后继元素值"<<endl;
return NULL;
}
if(Node->right!=NULL)
{
cout<<Node->data<<"的后继值是"<<search_min(Node->right)->data<<endl;
return search_min(Node->right);


}
else
{
BNode<Type> *p=Node->parent;
while(p!=NULL&&p->right==Node)
{
Node=p;
p=p->parent;
}
cout<<Node->data<<"的后继值是"<<p->data<<endl;
return p;
}
}


int main()
{   BTree<int> tree;
    tree.add_element(6);
tree.add_element(5);
tree.add_element(4);
tree.add_element(2);
tree.add_element(7);
tree.add_element(8);
tree.inorder_traverse(tree.get_root());
tree.Tree_Search(tree.get_root(),5);
tree.search_min(tree.get_root());
tree.search_max(tree.get_root());
tree.tree_successor(tree.search_max(tree.get_root()));


system("pause");
return 0;
}

0 0