数据结构实验六 树(二叉链表,统计结点总数及叶子结点数)

本次实验旨在熟悉二叉树的链式存储,重点掌握建立和深度优先递归遍历算法。实验内容包括交换特定条件下的左右子树以及统计二叉树中结点和叶子结点的数量。
摘要由CSDN通过智能技术生成

一、 实验目的
1. 熟悉二叉树的链式存储结构
2. 掌握二叉树的建立、深度优先递归遍历等算法
3. 能够利用遍历算法实现一些应用
二、 实验内容
1. 已知二叉树采用二叉链表存储结构,如果左、右子树非空,且左子树根结点大于右子树根结点,则交换根结点的左、右子树。即按要求交换二叉树及子树的左、右子树。

2. 采用二叉链表结构存储一棵二叉树,编写一个算法统计该二叉树中结点总数及叶子结点总数。

//bitree.h
//本头文件包含binode类和二叉链表bitree类
#include<iostream>
using namespace std;

template<class T>
struct binode
{
    T data;     //存储数据
    binode<T> * lchild,* rchild; //左孩子,右孩子
};

template<class T>
class bitree
{
    private:
        binode<T> * root;  //指向根节点的头指针
        int allsum;//节点总数
        int yesum;//叶子节点总数
        int a;
        binode<T> * creat(binode<T> *bt);  //构造函数调用
        void release(binode<T> *bt);  //析构函数调用
        void preorder(binode<T> *bt); //前序遍历函数调用
        void inorder(binode<T> *bt);  //中序遍历函数调用
        void postorder(binode<T> *bt);//后序遍历函数调用
        void exchange(binode<T> *bt);//交换左右子树,实验五第一问
        int sum(binode<T> *bt);//节点总数,实验五第二问
        int ysum(binode<T> *bt);//叶子节点总数,实验五第二问
        int px(binode<T> *bt);
    public:
        bitree(){root=creat(root);}  //构造函数
        ~bitree(){release(root);}     //析构函数

        void preorder(){preorder(root);} //前序遍历函数
        void inorder(){inorder(root);}  //中序遍历函数
        void postorder(){postorder(root);} //后序遍
首先,二叉链表是一种据结构,可以用来表示二叉树。在二叉链表中,每个结点都有两个指针,分别指向其左子和右子。 下面是使用二叉链表创建一棵二叉树的代码: ```c++ #include <iostream> using namespace std; // 定义二叉树结点类型 struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; // 创建二叉树 void createTree(TreeNode*& root) { int val; cin >> val; if (val == -1) { // 输入-1表示结点为空 root = NULL; } else { root = new TreeNode(val); createTree(root->left); createTree(root->right); } } // 先序遍历 void preOrder(TreeNode* root) { if (root != NULL) { cout << root->val << " "; preOrder(root->left); preOrder(root->right); } } // 中序遍历 void inOrder(TreeNode* root) { if (root != NULL) { inOrder(root->left); cout << root->val << " "; inOrder(root->right); } } // 后序遍历 void postOrder(TreeNode* root) { if (root != NULL) { postOrder(root->left); postOrder(root->right); cout << root->val << " "; } } // 统计深度、叶子结点结点总数 void countNodes(TreeNode* root, int& depth, int& leaf, int& nodes) { if (root != NULL) { nodes++; if (root->left == NULL && root->right == NULL) { leaf++; } int ldepth = 0, rdepth = 0; countNodes(root->left, ldepth, leaf, nodes); countNodes(root->right, rdepth, leaf, nodes); depth = max(ldepth, rdepth) + 1; } } // 销毁二叉树 void destroyTree(TreeNode*& root) { if (root != NULL) { destroyTree(root->left); destroyTree(root->right); delete root; root = NULL; } } int main() { TreeNode* root; cout << "请输入二叉树结点,-1表示结点:" << endl; createTree(root); cout << "先序遍历结果:"; preOrder(root); cout << endl; cout << "中序遍历结果:"; inOrder(root); cout << endl; cout << "后序遍历结果:"; postOrder(root); cout << endl; int depth = 0, leaf = 0, nodes = 0; countNodes(root, depth, leaf, nodes); cout << "深度:" << depth << endl; cout << "叶子结点:" << leaf << endl; cout << "结点总数:" << nodes << endl; destroyTree(root); return 0; } ``` 上述代码中,我们首先定义了二叉树结点的结构体类型 `TreeNode`,并定义了三个指向左子、右子结点值的成员变量。在 `createTree()` 函中,我们通过递归的方式创建二叉树,如果输入的值为-1,则表示结点为空。 接下来,我们分别定义了三个遍历函 `preOrder()`、`inOrder()` 和 `postOrder()`,分别实现二叉树的先序、中序和后序遍历。这三个函的实现都采用了递归的方式,先访问左子,然后访问右子,最后访问根结点。 在 `countNodes()` 函中,我们统计二叉树的深度、叶子结点结点总数。在递归过程中,我们累计每个结点的深度,如果该结点没有左子和右子,则它是叶子结点,否则它不是叶子结点。最后,我们求出深度的最大值,加1即为二叉树的深度。 最后,在 `destroyTree()` 函中,我们使用递归的方式销毁二叉树
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值