数据结构实验(四)二叉树的基本操作

简介: 数据结构实验(四)二叉树的基本操作

一、以二叉链表作为二叉树的存储结构

(1)统计二叉树的叶结点个数

(2)判别两棵树是否相等

(3)交换二叉树每个结点的左孩子和右孩子

(4)设计二叉树的双序遍历算法(递归调用)

(5)求二叉树的深度

二、完整代码:

#include<iostream>
 
using namespace std;
 
typedef struct TreeNode {
  char data;//数据域
  TreeNode* Lchild;//左孩子
  TreeNode* Rchild;//右孩子
}*Tree,TreeNode;
 
//前序创建二叉树
void CreateTree(Tree& T) {
  char x;
  cin >> x;
  if (x =='*')
  {
    T = NULL; 
  }
  else 
  {
    T = new TreeNode;//新建一个结点 
    T->data = x;
    CreateTree(T->Lchild);//生成左孩子结点 
    CreateTree(T->Rchild);//生成右孩子结点 
  }
}
//先序遍历
void Pre_Traversal(const Tree& T) {
  if (T) {
    cout << T->data<<" ";
    Pre_Traversal(T->Lchild);
    Pre_Traversal(T->Rchild);
  }
}
//中序遍历
void Ino_Traversal(const Tree& T) {
  if (T) {
    Ino_Traversal(T->Lchild);
    cout << T->data<<" ";
    Ino_Traversal(T->Rchild);
  }
}
//后序遍历
void Pos_Traversal(const Tree& T) {
  if (T) {
    Pos_Traversal(T->Lchild);
    Pos_Traversal(T->Rchild);
    cout << T->data << " ";
    
  }
}
//二叉树是否为空
bool TreeEmpty(const Tree& T) {
  if (T == NULL)
  {
    cout << "该二叉树为空!"<<endl; 
    return true;
  }
  else
  {
    cout << "该二叉树为不为空!"<<endl;
    return false;
  }
}
//求二叉树的叶子节点数
int Treeleaf_Count(const Tree& T) {
  if(T == NULL)
  {
    return 0;
  }
  if (T->Lchild == NULL && T->Rchild == NULL)
  {
    return 1;
  }
  return Treeleaf_Count(T->Lchild) + Treeleaf_Count(T->Rchild);
}
 
//交换左孩子和右孩子
void swap( Tree& T)
{
    //如果T不存在,就返回
    if(T == NULL) 
  {
    return; 
  }
    //如果T的左右子树都不存在就返回
    if(T->Lchild == NULL && T->Rchild == NULL) 
  {
    return;
  }
  //左右子树交换
  
  
  Tree tmp = T->Lchild;
    T->Lchild = T->Rchild;
    T->Rchild = tmp;
    swap(T->Lchild);
    swap(T->Rchild);
  
    
    
}
//求二叉树的深度
int TreeDepth(const Tree& T) {
  if (T == NULL) return 0;
  else {
    int i = TreeDepth(T->Lchild);
    int j = TreeDepth(T->Rchild);
    return i > j ? i + 1 : j + 1;
  }
 
}
// 递归比较两棵树是否相等
bool CompareTrees(Tree& t1, Tree& t2) {
    if (t1 && t2) {
        // 比较当前节点的值
        if (t1->data == t2->data) {
            // 递归比较左子树和右子树
            return CompareTrees(t1->Lchild, t2->Lchild) && CompareTrees(t1->Rchild, t2->Rchild);
        } else {
            return false;
        }
    } else if (!t1 && !t2) {
        // 如果都是空树,二者相同
        return true;
    } else {
        // 其他情况,二者不同
        return false;
    }
}
 
// 双序遍历:先序遍历 + 后序遍历
void DoubleOrderTraversal(Tree& root) {
    if (root) {
        // 先输出根节点
        cout << root->data << " ";
 
        // 递归遍历左子树
        DoubleOrderTraversal(root->Lchild);
 
        // 递归遍历右子树
        DoubleOrderTraversal(root->Rchild);
 
        // 再输出根节点
        cout << root->data << " ";
    }
}
int main(){
  Tree T;
  cout << "请按先序遍历的顺序创建二叉树,若其节点的左孩子或右孩子不存在则使用*代替!如:(ABC**DE*G**F***)" << endl;
  CreateTree(T);
  TreeEmpty(T);
  cout << "先序遍历的结果为:";
  Pre_Traversal(T) ;
  cout<< endl;
  cout << "中序遍历的结果为:";
  Ino_Traversal(T);
  cout << endl;
  cout << "后序遍历的结果为:";
  Pos_Traversal(T);
  cout << endl;
  cout << "该树的深度为:"<< TreeDepth(T)<< endl;
  cout << "该树的叶子节点数为:" << Treeleaf_Count(T) << endl;
  swap(T);
  cout << "该先序排序的树交换左右孩子后的先序排序结果为:" <<endl;
  Pre_Traversal(T);
  cout<<"\n"<<endl; 
 
  Tree tree1;
  Tree tree2;
  cout<<"输入tree1树:"<<endl; 
  CreateTree(tree1);
  cout<<"输入tree2树:"<<endl; 
  CreateTree(tree2);
  
  if (CompareTrees(tree1, tree2)) 
  {
        cout << "两棵树相等" << endl;
    } else {
        cout << "两棵树不相等" << endl;
    }
    
    Tree tree3;
    cout<<"输入tree3树:"<<endl; 
    CreateTree(tree3);
    // 进行双序遍历
    cout<<"tree3树双序(先+后)遍历的结果为:"<<endl;
    DoubleOrderTraversal(tree3);
    cout<<"\n"<<endl;
    system("pause");
  
}
相关文章
|
2月前
|
存储 算法 编译器
数据结构实验之矩阵的运算器(二维数组)
本实验旨在通过团队合作,掌握数组和矩阵相关运算的代码实现,包括矩阵的加减、数乘、转置、乘法、n次方及行列式的计算。实验过程中,成员们需分工协作,解决编程难题,最终实现一个功能完备的矩阵计算器。通过本实验,不仅锻炼了编程能力,还加深了对数学概念的理解,同时培养了团队合作精神。
75 4
|
2月前
数据结构实验之串模式匹配问题
本实验旨在掌握串模式匹配技术,通过创建文本文件、实现单词计数与定位功能,最终构建一个包含文件建立、单词统计与定位、程序退出等选项的主菜单,以增强对字符串处理的理解与应用能力。
69 4
|
2月前
|
算法
数据结构实验之最长公共子序列
本实验旨在通过编程实践帮助学生理解串的基本概念及求解最长公共子序列的算法。实验内容包括使用动态规划方法设计并实现算法,以找出给定两序列的最大公共子序列。示例代码展示了如何通过构建状态矩阵和回溯路径来找到解决方案。实验总结指出,`memset()`函数用于内存初始化,且对于特定输入,程序能正确输出最长公共子序列之一。
64 4
|
2月前
|
算法
数据结构实验之操作系统打印机管理器问题
本实验旨在通过实现操作系统中的打印机管理器问题,掌握队列的基本操作如入队、出队等,利用队列的先进先出特性解决先申请先打印的问题。实验包括队列的初始化、入队、出队、打印队列内容等功能,并通过菜单式界面进行交互。实验结果显示基本功能可正常执行,但在连续操作时存在执行失败的情况,需进一步优化。
55 4
|
2月前
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
68 4
|
7天前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
33 12
|
7天前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
32 10
|
7天前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
28 2
|
21天前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
2月前
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
109 4

热门文章

最新文章