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

实验四 二叉排序树

一、实验目的

掌握二叉排序树的构造

二、实验内容

(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;
}




}


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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值