数据结构实验十 二叉树的遍历和基本运算

一、实验目的

1.理解二叉树的逻辑结构和存储结构;

2.熟练掌握二叉树的生成、遍历等常见操作

二、实验原理

1.二叉树是一种最常用的树形结构,是n个节点的有限结合。对于非空树有:

(1)有一个特定的称为根的节点;

(2)根节点以外的其余节点分别是由两棵互不相交的称为左子树和右子树的二叉树组成。

2.二叉树有两种存储结构:顺序存储和链式存储。顺序存储就是把二叉树的所有节点按照层次顺序存储到连续的存储单元中,这种更适用于完全二叉树。链式存储又称二叉链表,每个节点包括两个指针,分别指向其左孩子和右孩子。链式存储是二叉树常用的存储结构。

3.二叉树的定义满足递归定义,二叉树的建立、遍历等操作都是采用递归定义分算法。

三、实验内容及步骤

(一)实验内容

1. 练习二叉树的建立与存储

2. 练习二叉树的遍历

(二)实验步骤

 建立二叉树,并通过调用函数,输出先序遍历、中序遍历与后序遍历的结果。根据给出的中序遍历算法编写后序遍历的算法。

#include<iostream>
using namespace std;
typedef struct BiNode{				//二叉链表定义
	char data;
	struct BiNode *lchild,*rchild;
}BiTNode,*BiTree;

//用算法5.3 先序遍历的顺序建立二叉链表
void CreateBiTree(BiTree &T){	
	//按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
	char ch;
	cin >> ch;
	if(ch=='#')  T=NULL;			//递归结束,建空树
	else{							
		T=new BiTNode;
		T->data=ch;					//生成根结点
		CreateBiTree(T->lchild);	//递归创建左子树
		CreateBiTree(T->rchild);	//递归创建右子树
	}								//else
}									//CreateBiTree

void InOrderTraverse(BiTree T){  
	//中序遍历二叉树T的递归算法
	if(T){
		InOrderTraverse(T->lchild);
		cout << T->data;
		InOrderTraverse(T->rchild);
	}
}

int main()
{
	BiTree tree;
	cout<<"请输入建立二叉链表的序列:\n";
	CreateBiTree(tree);
	cout<<"中序遍历的结果为:\n";
	InOrderTraverse(tree);
	cout<<endl;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是使用C++语言实现二叉树基本运算遍历的示例代码: ```C++ #include<iostream> using namespace std; struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; class BinaryTree { public: TreeNode *root; BinaryTree() { root = NULL; } // 插入节点 void insertNode(int val) { TreeNode *newNode = new TreeNode(val); if (root == NULL) { root = newNode; return; } TreeNode *temp = root; while (temp) { if (val < temp->val) { if (temp->left == NULL) { temp->left = newNode; return; } else { temp = temp->left; } } else { if (temp->right == NULL) { temp->right = newNode; return; } else { temp = temp->right; } } } } // 删除节点 void deleteNode(int val) { TreeNode *temp = root; TreeNode *parent = NULL; while (temp && temp->val != val) { parent = temp; if (val < temp->val) { temp = temp->left; } else { temp = temp->right; } } if (temp == NULL) { cout << "Node not found." << endl; return; } if (temp->left == NULL) { if (parent == NULL) { root = temp->right; } else { if (temp == parent->left) { parent->left = temp->right; } else { parent->right = temp->right; } } delete temp; return; } else if (temp->right == NULL) { if (parent == NULL) { root = temp->left; } else { if (temp == parent->left) { parent->left = temp->left; } else { parent->right = temp->left; } } delete temp; return; } else { TreeNode *successor = temp->right; while (successor->left != NULL) { successor = successor->left; } int successorVal = successor->val; deleteNode(successorVal); temp->val = successorVal; } } // 查找节点 TreeNode *searchNode(int val) { TreeNode *temp = root; while (temp && temp->val != val) { if (val < temp->val) { temp = temp->left; } else { temp = temp->right; } } return temp; } // 修改节点 void modifyNode(int oldVal, int newVal) { TreeNode *node = searchNode(oldVal); if (node == NULL) { cout << "Node not found." << endl; return; } node->val = newVal; } // 前序遍历 void preorder(TreeNode *node) { if (node == NULL) { return; } cout << node->val << " "; preorder(node->left); preorder(node->right); } // 中序遍历 void inorder(TreeNode *node) { if (node == NULL) { return; } inorder(node->left); cout << node->val << " "; inorder(node->right); } // 后序遍历 void postorder(TreeNode *node) { if (node == NULL) { return; } postorder(node->left); postorder(node->right); cout << node->val << " "; } }; int main() { BinaryTree tree; tree.insertNode(5); tree.insertNode(2); tree.insertNode(8); tree.insertNode(1); tree.insertNode(3); tree.insertNode(6); tree.insertNode(9); cout << "Preorder traversal: "; tree.preorder(tree.root); cout << endl; cout << "Inorder traversal: "; tree.inorder(tree.root); cout << endl; cout << "Postorder traversal: "; tree.postorder(tree.root); cout << endl; tree.deleteNode(5); cout << "Inorder traversal after deleting node 5: "; tree.inorder(tree.root); cout << endl; tree.modifyNode(2, 10); cout << "Inorder traversal after modifying node 2 to 10: "; tree.inorder(tree.root); cout << endl; return 0; } ``` 输出结果为: ``` Preorder traversal: 5 2 1 3 8 6 9 Inorder traversal: 1 2 3 5 6 8 9 Postorder traversal: 1 3 2 6 9 8 5 Inorder traversal after deleting node 5: 1 2 3 6 8 9 Inorder traversal after modifying node 2 to 10: 1 3 6 8 9 10 ``` 以上代码实现了二叉树基本运算遍历,包括插入节点、删除节点、查找节点、修改节点、前序遍历、中序遍历、后序遍历。其中,插入节点、删除节点、查找节点、修改节点的实现使用了二叉查找树的思想,遍历的实现使用了递归。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Meteor.792

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值