您的位置:首页 > 理论基础 > 数据结构算法

数据结构试验:二叉排序树

2012-06-02 00:13 495 查看

实验四 二叉排序树

一、实验目的

掌握二叉排序树的构造

二、实验内容

(1)构建一个二叉排序树(中序遍历的时候会输出排序结果),树中结点数据取自数组a[10]。a[10]={8,3,6,1,5,2,9,7,4,0}

(2)分别用三种遍历方法输出遍历结果。

(3)键盘输入一个值x,要求在生成好的二叉排序树中查找这个值x,如果找到,则输出“找到了”,没有找到,则输出“没有找到”

==============================================================

#include<iostream>
using namespace std;

/*************************
Copyright L迁客2012-06-01.
All Rights Reserved.
**************************/

//定义数据结构
struct NODE
{
int data;
NODE* left;
NODE* right;
};

/*************************
*定义一个是否查找到的标识。
我觉得递归用法不应该有cout等输出语句,
因为递归调用会导致递归输出,
所以定义一个标识flag,
这里用一个全局变量其实不是很好,
但是考虑到简单,就这么做了!!!
**************************/
int flag = 0;

//整个程序封装成一个类
class Tree
{
public:
Tree();
//根据一个整形的数组和数组的元素来构造一棵树
void buildTree(int data[],int n);

//三种遍历方式。
void preorder();
void inorder();
void postorder();

//查找函数
void search(int temp);
private:
//遍历树的辅助函数
void recursive_inorder(NODE* root);
void recursive_preorder(NODE* root);
void recursive_postorder(NODE* root);

void recursive_search(NODE* root,int temp);

/****************************************
这个叫做插入函数,是构造树的时候需要用的,
构造二叉排序树,我这里用的还是递归.
注意,我这里用的是双重指针,因为我要往root里面插入值!
然而我们知道,要改变root的值,必须要用指针(地址)。
不然作为形参操作,离开了函数,不会改变形参的值。
*****************************************/
void insert(NODE** tree,int key);

NODE* root;//树根

};

//在构造函数中把root设为NULL
Tree::Tree()
{
root = NULL;
}

void Tree::insert(NODE** tree,int key)
{
if(*tree == NULL)
{
/***************************
注意这里的用法,我们要用(*tree),
因为定义的是双重指针,
而我们要操作的是地址里面的内容!
****************************/
*tree = new NODE();
(*tree)->data = key;

(*tree)->left = NULL;
(*tree)->right = NULL;
return;
}
if(key < (*tree)->data)
{
/*****************
递归用法,如果看不懂,
那么先去看看递归吧!
*******************/
insert(&(*tree)->left,key);
}
else
{
/*****************
递归用法,如果看不懂,
那么先去看看递归吧!
*******************/
insert(&(*tree)->right,key);
}

}

/********************
这就是用递归函数insert()来构建树!
根据比较数组的值的大小,动态插入。
*********************/
void Tree::buildTree(int data[],int n)
{
cout<<"开始构造排序二叉树……"<<endl<<endl;

for(int i = 0;i < n;i++)
{
insert(&root,data[i]);
}

cout<<"构造排序二叉树完毕……"<<endl<<endl;
}

//【先序遍历】层次二叉树
void Tree::preorder()
{
cout<<"先序遍历…"<<endl;

recursive_preorder(root);

cout<<endl;
}

//【先序遍历】层次二叉树的辅助方法。
void Tree::recursive_preorder(NODE* root)
{
NODE* p = root;//取根节点,进行操作。。

//打印访问到的当前节点
if(p != NULL)
{
cout<<p->data<<" -> ";//visit()
}

/*******************
递归遍历左右子树,
条件是,左右子树访问到NULL
*******************/
if(p->left != NULL)
{
recursive_preorder(p->left);
}
if(p->right != NULL)
{
recursive_preorder(p->right);
}

}

//【中序遍历】层次二叉树
void Tree::inorder()
{
cout<<"中序遍历…"<<endl;

recursive_inorder(root);

cout<<endl;
}

//【中序遍历】层次二叉树的辅助函数
void Tree::recursive_inorder(NODE* root)
{
NODE* p = root;//取根节点,进行操作。。

/*******************
要先走到最左子树,
直到访问到NULL,
也就是左子树尽头,
就返回,
开始访问节点。
*******************/
if(p == NULL)
{
return;
}

/*******************
先遍历到最左节点,
然后,访问该节点,
如果该节点不是NULL,
就【递归遍历】左、中、右节点。
*******************/
if(p->left != NULL)
{
recursive_inorder(p->left);
}

cout<<p->data<<" -> ";//visit()

if(p->right != NULL)
{
recursive_inorder(p->right);
}

}

//【后序遍历】层次二叉树
void Tree::postorder()
{
cout<<"后序遍历…"<<endl;

recursive_postorder(root);

cout<<endl;
}

//【后序遍历】层次二叉树的辅助函数。
void Tree::recursive_postorder(NODE* root)
{
NODE* p = root;//取根节点,进行操作。。

/*******************
要先走到最左子树,
直到访问到NULL,
也就是左子树尽头,
就返回,
开始访问节点。
*******************/
if(p == NULL)
{
return;
}

/*******************
先遍历到最左节点,
然后,访问该节点,
如果该节点不是NULL,
就【递归遍历】左、中、右节点。
*******************/
if(p->left != NULL)
{
recursive_postorder(p->left);
}

if(p->right != NULL)
{
recursive_postorder(p->right);
}

cout<<p->data<<" -> ";//visit()

}

void Tree::recursive_search(NODE* root,int temp)
{
/*******************
用的是先序遍历来实现查找!
*******************/

NODE* p = root;//取根节点,进行操作。。

//访问到当前节点,判断如果等于要查找的值,就标识。。
if(p != NULL)
{
if(p->data == temp)
flag = 1;
}

if(p->left != NULL)
{
recursive_search(p->left,temp);
}
if(p->right != NULL)
{
recursive_search(p->right,temp);
}

}

void Tree::search(int temp)
{
//利用recursive_search递归查找。
recursive_search(root,temp);

}

void main()
{
int data[10]={8,3,6,1,5,2,9,7,4,0};//定义一个数组。
Tree tree;
tree.buildTree(data,10);//构造树

/************************************
用三种方法遍历我们构造出来的排序二叉树!
************************************/
tree.inorder();
tree.preorder();
tree.postorder();

int temp;
cout<<"请输入要查找的值:"<<endl;
cin>>temp;

tree.search(temp);//开始查找
switch(flag)
{
case 1:
cout<<"get it..."<<endl<<endl;
break;
case 0:
cout<<"fail to get it..."<<endl<<endl;
break;
}

}

==============================================================
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: