二叉树实验

一..实验目的

     巩固树和二叉树的相关知识,特别是二叉树的相关内容。学会运用灵活应用。

1.回树和二叉树的逻辑结构和存储方法,清楚掌握树和二叉树的遍历操作。

2.学习树的相关知识来解决实际问题。

3.进一步巩固程序调试方法。

4.进一步巩固模板程序设计。

二.实验时间

   准备时间为第10周到第12前半周,具体集中实验时间为12周周四。2个学时。

三..实验内容

1.自己设计一个二叉树,深度最少为4,请递归算法分别用前序、中序、后序遍历输出树结点。

# ifndef Bitree_H
# define Bitree_H

struct BiNode
{
	char data;
	BiNode *lchild,*rchild;
};

class Bitree
{
public:
	Bitree(){root=Creat(root);}
	~Bitree(){Release(root);}
	void PreOrder(){PreOrder(root);}
	void InOrder(){InOrder(root);}
	void PostOrder(){PostOrder(root);}
private:
	BiNode*root;
	BiNode*Creat(BiNode*bt);
	void Release(BiNode*bt);
	void PreOrder(BiNode*bt);
	void InOrder(BiNode*bt);
	void PostOrder(BiNode*bt);
};
# endif
# include <iostream>
using namespace std;
# include"Bitree.h"

BiNode *Bitree::Creat(BiNode *bt)//
{
	char ch;
	cout<<"请输入创建一个二叉树的结点数据"<<endl;
	cin>>ch;
	if(ch=='#')return NULL;
	else
	{
		bt=new BiNode;
	bt->data=ch;
		bt->lchild=Creat(bt->lchild);
		bt->rchild=Creat(bt->rchild);
	}
	return bt;
}

void Bitree::Release(BiNode*bt)
{
	if(bt!=NULL){
		Release(bt->lchild);
		Release(bt->rchild);
		delete bt;
	}
}

void Bitree::PreOrder(BiNode *bt)
{
	if(bt==NULL)return;
	else{
		cout<<bt->data<<" ";
		PreOrder(bt->lchild);
		PreOrder(bt->rchild);
	}
}

void Bitree::InOrder (BiNode*bt)
{
	if(bt==NULL)return;
	else {
		InOrder(bt->lchild);
		cout<<bt->data<<" ";
		InOrder(bt->rchild);
	}
}

void Bitree::PostOrder(BiNode *bt)
{
	if(bt==NULL)return;
	else{
		PostOrder(bt->lchild);
		PostOrder(bt->rchild);
		cout<<bt->data<<" ";
	}
}

# include<iostream>
using namespace std;
# include"Bitree.h"

int main(){
	Bitree T;
	cout<<"-----前序遍历-----"<<endl;
	T.PreOrder();
	cout<<endl;
	cout<<"-----中序遍历-----"<<endl;
	T.InOrder();
	cout<<endl;
	cout<<"-----后序遍历-----"<<endl;
	T.PostOrder();
	cout<<endl;
	return 0;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
一、实验目的: 理解二叉树特别是完全二叉树的性质,掌握二叉树的存储结构(二叉链表);熟练掌握二叉树的常用操作算法(初始化、插入结点、删除结点、遍历等);初步掌握二叉树的应用。 二、实验内容: 要求采用二叉链表作为存储结构,完成二叉树的建立,前序、中序和后序遍历的操作,求所有叶子及结点总数的操作等。 具体要求如下: ①给出基于二叉链表的二叉树类的定义; ②给出二叉树初始化(构造函数)的实现; ③给出二叉树三种遍历算法的递归实现; ④二叉树先序遍历的非递归算法实现; ⑤利用二叉树的遍历算法求二叉树的结点数、二叉树的叶结点数、二叉树的高度; ⑥二叉树的撤销删除 三、实验步骤: 1、需求分析: 本演示程序用JAVA编写,完成树的生成,任意位置的插入、删除,以及遍历二叉树中的结点,查找和修改树中元素的值。 ① 输入的形式和输入值的范围:插入元素时需要输入插入的位置和元素的值;删除元素时输入删除元素的位置;遍历时采用三种遍历方法中的一种遍历方法;修改操作时需要输入的元素的值;查找操作时,需要找到要查找元素的位置。在所有输入中,元素的值都是整数。 ② 输出的形式:在所有四种操作中都显示操作是否正确以及操作后树中的内容。其中删除操作后显示删除的元素的值,遍历二叉树中的元素,查找操作、修改操作后显示修改的值。 ③ 程序所能达到的功能:完成树的生成(通过插入操作)、插入、删除、遍历、查找、修改操作。 ④ 测试数据: A. 树中已有以50,25,75,12,37,43,30,33,87,93,97为关键字的结点 B. 插入操作中依次输入10,20,30,40,50,60,70,80,90,100十个数 C. 删除操作中输入10删除值为10的元素 D. 查找操作中输入20,30,40,50返回这个元素在树中的位置 2.概要设计: 1)为了实现上述程序功能,需要定义树的抽象数据类型: public int iData; public double dData; public Node leftChild; public Node rightChild; private Node root;int value; private Node getSuccessor; 基本操作:{ Tree () 操作结果:构造一个空的二叉树 insert () 初始条件:是否存在一个空二叉树 操作结果:往二叉树中插入数值 delete () 初始条件:存在一非空的二叉树 操作条件:将二叉树中的元素删除 displayTree () 初始条件:存在一非空的树 操作条件:显示非空树中的所有元素的值 getString () 初始条件:存在一非空的二叉树 操作结果:返回整个字符串的数值 getChar () 初始条件:存在一非空的二叉树 操作结果:返回字符型的数值 getInt () 初始条件:存在一非空的二叉树 操作结果:返回整型的数值 find () 初始条件:存在一非空二叉树 操作结果:从二叉树中查找某一元素 traverse () 初始条件:存在一非空的二叉树 操作结果:对二叉树中的元素进行遍历 preorder () 初始条件:存在一非空的二叉树 操作结果:对二叉树中的元素进行先根遍历 inOrder () 初始条件:存在一非空的二叉树 操作结果:对二叉树中的元素进行中根遍历 postOrder () 初始条件:存在一非空的二叉树 操作结果:对二叉树中的元素进行后根遍历 DisplayNode () 初始条件:存在一非空的二叉树 操作结果:显示出二叉树中的整形数值和双精度浮点型数值 public static void main 操作结果:调用主函数
好的,我可以提供一份二叉树实验代码的示例,供你参考。以下是一个简单的二叉树实现,包括节点的结构体定义、创建、遍历、插入和删除操作等。 ``` #include <stdio.h> #include <stdlib.h> // 二叉树节点结构体定义 typedef struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; } TreeNode; // 创建二叉树 TreeNode *createTree() { TreeNode *root = NULL; int val; printf("请输入二叉树的根节点值:"); scanf("%d", &val); if (val == -1) { // 输入-1表示结束 return NULL; } root = (TreeNode *)malloc(sizeof(TreeNode)); root->val = val; root->left = createTree(); // 递归创建左子树 root->right = createTree(); // 递归创建右子树 return root; } // 前序遍历二叉树 void preorderTraversal(TreeNode *root) { if (root == NULL) { return; } printf("%d ", root->val); preorderTraversal(root->left); preorderTraversal(root->right); } // 中序遍历二叉树 void inorderTraversal(TreeNode *root) { if (root == NULL) { return; } inorderTraversal(root->left); printf("%d ", root->val); inorderTraversal(root->right); } // 后序遍历二叉树 void postorderTraversal(TreeNode *root) { if (root == NULL) { return; } postorderTraversal(root->left); postorderTraversal(root->right); printf("%d ", root->val); } // 插入节点 void insertNode(TreeNode *root, int val) { if (root == NULL) { return; } if (val < root->val) { // 插入左子树 if (root->left == NULL) { TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode)); node->val = val; node->left = NULL; node->right = NULL; root->left = node; } else { insertNode(root->left, val); } } else { // 插入右子树 if (root->right == NULL) { TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode)); node->val = val; node->left = NULL; node->right = NULL; root->right = node; } else { insertNode(root->right, val); } } } // 删除节点 TreeNode *deleteNode(TreeNode *root, int val) { if (root == NULL) { return NULL; } if (val < root->val) { // 在左子树中删除 root->left = deleteNode(root->left, val); } else if (val > root->val) { // 在右子树中删除 root->right = deleteNode(root->right, val); } else { // 找到了要删除的节点 if (root->left == NULL) { // 只有右子树 TreeNode *temp = root->right; free(root); return temp; } else if (root->right == NULL) { // 只有左子树 TreeNode *temp = root->left; free(root); return temp; } else { // 左右子树都存在 TreeNode *temp = root->right; while (temp->left != NULL) { temp = temp->left; } root->val = temp->val; root->right = deleteNode(root->right, temp->val); } } return root; } // 主函数 int main() { TreeNode *root = NULL; int val; root = createTree(); // 创建二叉树 printf("前序遍历:"); preorderTraversal(root); // 前序遍历 printf("\n中序遍历:"); inorderTraversal(root); // 中序遍历 printf("\n后序遍历:"); postorderTraversal(root); // 后序遍历 printf("\n请输入要插入的节点值:"); scanf("%d", &val); insertNode(root, val); // 插入节点 printf("插入后的中序遍历:"); inorderTraversal(root); // 中序遍历 printf("\n请输入要删除的节点值:"); scanf("%d", &val); root = deleteNode(root, val); // 删除节点 printf("删除后的中序遍历:"); inorderTraversal(root); // 中序遍历 return 0; } ``` 以上是一个简单的二叉树实现示例,你可以根据自己的需求进行修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值