头文件
#include<iostream> //输入输出流
#include<stdlib> //随机函数要用
#include<ctime> //使随机函数随时间变化
#include<iomanip> //按格式输出
using namespace std;
结构体
typedef struct node{
int data; //二叉树的节点所带的信息为整型变量
struct node *rihgt; //建立一个指向左边节点,指向结构体的指针
struct node *left; //同上
}Node; //将struct node重定义为Node
typedef struct
{
Node* root; 定义一个指向root的结构体指针
}Tree; //将此struct 重定义为Tree
主函数
int main()
{
int arr[7] = { 6,3,8,2,5,1,7 }; //这里预先将数据存在数组中
Tree tree; //实例化一个对象tree
tree.root = NULL; //令root指向NULL,避免野指针出现
for (int i = 0; i < 7; i++) {
insert(&tree, arr[i]); //建立二叉树,并利用循环将数组中的数据依次插入二叉树中
}
inorder(tree.root); //按从小到大的顺序依次输出二叉树的数据(中序)
system("pause"); //让系统停止执行,方便观察结果
return 0;
}
建立二叉树并存入数据
要求:root->data > root->left->data
and root->data < root->right->data
即 根>左 并且 根<右
void insert(Tree* tree, int value) {
Node* node = new Node; //新建一个节点node
node->data = value; //将传递过来的参数存入新节点中
node->left = NULL; //避免野指针
node->rihgt = NULL; //同上
if (tree->root == NULL) { //如果当前节点为空
tree->root = node; //就将新节点连接在当前节点
}
else { //如果当前节点不为空
Node* temp = tree->root; //新建一个节点temp并指向当前节点
while (temp != NULL) { //如果temp不为空
if (value < temp->data) { //判断temp->data与node->data的大小
if (temp->left == NULL) { //当temp的left为空时
temp->left = node; //将node连接作为temp的左子树
return ; //结束当前函数
}
else { //当temp的left不为空时
temp = temp->left; //令temp为temp的左儿子
} //进入下一轮循环检查temp->data与node->data的大小
}
else { //如果temp->data小于node->data
if (temp->rihgt == NULL) {
temp->rihgt = node;
return ;
}
else {
temp = temp->rihgt;
}
}
}
}
}
遍历二叉树
遵循先左后根再右
void inorder(Node* node) {
if (node != NULL) { //当前节点为空时结束程序
inorder(node->left); //先一路向左走,直到最末节点
cout << node->data << endl; //输出当前节点的值
inorder(node->rihgt); //输出当前节点右子树的值
}
}