本实验设计为类外函数
        二叉树的函数设计精髓是递归函数的调用,设计时函数的形参传入的是tree,实际上是传入了此树的根节点,因此“当前树的根节点”概念比较重要。在递归之后,替代形参的是以此根节点的左右孩子节点为根节点的左右子树,实现将树不断简化直到只有叶子。尤其注意在递归之后有些量的值不可以改变,下面会有所提及。

tips:
        节点声明中:普通节点为node,将树连根视为整体用tree。
        创建树的递归,可以理解为创建完当前根节点后,继续创建其左右子树。
        计算高度函数中, 可以理解为不断计算的是其左右子树的树高,比较后获得最大值。直到只有子叶,然后递归累积即可。
        中序遍历+求高度函数中,高度的求解实际上是层次数的求解,易得:层次数=总树高-此节点的树的高度+1得到层次数。注意此处的总树高需要提前求出作为形参,在函数中进行计算会随着递归改变总高度的值。
        中序调前k个函数中,和先序不同的是调处于中间位置的根节点时还需要判断溢出是否过k,原因是防止count在遍历完左子后已经到k了。
        计算总节点数中,空节点返回0,其他情况都是返回1(此节点)+左右子树的节点数目。
        复制树函数,按照先序先复制当前节点(视为根节点),再复制以此节点为根的左右子树。
        交换左右叶子函数中,当扫描判断到空指针,则按照前面的create函数,没有键入data,不可以交换其data域(使用->data),只可以交换其指针值。

//binary_tree_code_test
#include <iostream>
using namespace std;
typedef char elementtype;typedef struct TreeNode {char data;//数据域TreeNode* Lchild;//左孩子TreeNode* Rchild;//右孩子
}*Tree,TreeNode;//1.树的创建(先序)
void CreateTree(Tree &T){char x;cin>>x;if(x=='*'){T=NULL;return;}else{T=new TreeNode;T->data=x;CreateTree(T->Lchild);CreateTree(T->Rchild);}
}//2.计算高度
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;}
}//3.先序遍历
void Pre_Traversal(const Tree &T){if(T){cout<<T->data<<" ";Pre_Traversal(T->Lchild);Pre_Traversal(T->Rchild);}
}//4.先序调前k个
void Pre_Traversal_k(const Tree &T,int k){static int count=1;if(T&&count<=k){cout<<T->data<<" ";count++;Pre_Traversal_k(T->Lchild,k);Pre_Traversal_k(T->Rchild,k);}
}//5.中序遍历
void Ino_Traversal(const Tree &T){if(T){Ino_Traversal(T->Lchild);cout<<T->data<<" ";Ino_Traversal(T->Rchild);}
}//6.中序遍历+求高度
void Ino_Traversal_h(const Tree &T,int height){if(T){Ino_Traversal_h(T->Lchild,height);cout<<T->data<<height-TreeDepth(T)+1<<" ";Ino_Traversal_h(T->Rchild,height);}
}//7.中序调前k个
void Ino_Traversal_k(const Tree &T,int k){static int count=1;if(T&&count<=k){Ino_Traversal_k(T->Lchild,k);if(count<=k){cout<<T->data<<" ";count++;}Ino_Traversal_k(T->Rchild,k);}
}//8.后序遍历
void Pos_Traversal(const Tree &T){if(T){Pos_Traversal(T->Lchild);Pos_Traversal(T->Rchild);cout<<T->data<<" ";}
}//9.后序调前k个
void Pos_Traversal_k(const Tree &T,int k){static int count=1;;if(T&&count<=k){Pos_Traversal_k(T->Lchild,k);Pos_Traversal_k(T->Rchild,k);if(count<=k){cout<<T->data<<" ";count++;}}
}//10.二叉树求度(叶子个数)
int TreeDegree(const Tree &T){int degree;if(T->Lchild&&T->Rchild)degree=2;else if((T->Lchild&&!T->Rchild)||(!T->Lchild&&T->Rchild))degree=1;else if(!T->Lchild&&!T->Rchild)degree=0;return degree;
}//11.度为2的节点个数
int search_node1(const Tree &T){static int count=0;if(T){if(TreeDegree(T)==2)count++;search_node1(T->Lchild);search_node1(T->Rchild);}return count;
}//12.叶子节点(度为0)个数
int search_node2(const Tree &T){static int count=0;if(T){if(TreeDegree(T)==0)count++;search_node2(T->Lchild);search_node2(T->Rchild);}return count;
}//13.计算总节点数
int TreeNodeCount(const Tree &T){if(T==NULL)return 0;//else if(T->Lchild==NULL&&T->Rchild==NULL)return 1;else return TreeNodeCount(T->Lchild)+TreeNodeCount(T->Rchild)+1;
}//14.复制树
void copy(const Tree &T,Tree &T1){if(T==NULL)T1=NULL;else{T1=T;copy(T->Lchild,T1->Lchild);copy(T->Rchild,T1->Rchild);}
}//15.交换左右叶子
void exchange(Tree &T){if(T==NULL)return;else{TreeNode *T0=new TreeNode;T0=T->Lchild;T->Lchild=T->Rchild;T->Rchild=T0;exchange(T->Lchild);exchange(T->Rchild);}
}//ABC*D**E*F**GH**I**
int main(){//创建二叉树cout<<"请按照先序输入一个二叉树,空指针用*表示:"<<endl;Tree T;CreateTree(T);//先序、中序、后续遍历cout<<"先序序列为:";Pre_Traversal(T);cout<<endl;cout<<"中序序列为:";Ino_Traversal(T);cout<<endl;cout<<"后序序列为:";Pos_Traversal(T);cout<<endl;//先序求前k个cout<<"请输入需要输出的节点个数k:";int k;cin>>k;cout<<"先序中前k个节点值为:";Pre_Traversal_k(T,k);cout<<endl;//求高度int height=TreeDepth(T);cout<<"树的高度为:"<<height<<endl;//求度为2个数、叶子个数cout<<"度为2的节点数目为:"<<search_node1(T);cout<<endl;cout<<"叶子节点数目为:"<<search_node2(T);cout<<endl;//计算总节点数cout<<"总节点数目为:"<<TreeNodeCount(T);cout<<endl;//中序遍历以及层次数cout<<"中序序列及各节点层次数为:";Ino_Traversal_h(T,height);cout<<endl;//将T复制给T1Tree T1;copy(T,T1);cout<<"由T复制而来的T1的先序序列为:";Pre_Traversal(T1);cout<<endl;//交换每个节点的左右孩子指针的值exchange(T);cout<<"交换后的二叉树先序序列为:";Pre_Traversal(T);cout<<endl;return 0;
}

数据结构实验+理解1 基于c++的二叉树函数实现相关推荐

  1. 数据结构实验1《基于线性表的图书管理系统》

    数据结构实验1<基于线性表的图书管理系统> (visual studio 2019可运行) 输入及输出要求见<数据结构C语言(第二版)>严蔚敏版 [本文仅用于啥都看不懂还想交作 ...

  2. b - 数据结构实验之查找二:平衡二叉树_二叉树、平衡二叉树、红黑树、B树、B+树与B*树...

    一.二叉树 1️⃣二叉查找树的特点就是左子树的节点值比父亲节点小,而右子树的节点值比父亲节点大,如图: 基于二叉查找树的这种特点,在查找某个节点的时候,可以采取类似于二分查找的思想,快速找到某个节点. ...

  3. 数据结构实验(C++实现):二叉树操作

    实验要求: 输入一个完全二叉树的层次遍历字符串,创建这个二叉树,输出这个二叉树的前序遍历字符串.中序遍历字符串.后序遍历字符串.结点数目.二叉树高度(上述每一个结果独立一行显示). 输入二叉树前序序列 ...

  4. 数据结构实验7《基于Dijsktra算法的最短路径求解》

    (visual studio 2019可运行) 输入及输出要求见<数据结构C语言(第二版)>严蔚敏版 [本文仅用于啥都看不懂还想交作业选手] 加了一点输入异常的反馈 基于基于Dijsktr ...

  5. 数据结构实验二 树和二叉树的实现

    广州大学学生实验报告 开课实验室:计算机科学与工程实验(电子楼418A)     2019年5月13日 学院 计算机科学与教育软件学院 年级.专业.班 计算机科学与技术172班 姓名 学号 17061 ...

  6. 数据结构实验报告,二叉树的基本操作(C语言)

    数据结构实验报告,二叉树的基本操作(C语言) 作者:命运之光 专栏:数据结构 目录 数据结构实验报告,二叉树的基本操作(C语言) 实验六 二叉树的基本操作 一.需求分析 二.概要设计 三.详细设计 四 ...

  7. 数据结构-实验二  树和二叉树的实现

     广州大学学生实验报告 开课实验室:计算机科学与工程实验(电子楼417)     2018年05月16日 学院 计算机科学与教育软件学院 年级.专业.班 网络161 姓名 卟咚君 学号 1606100 ...

  8. sdut 2137 数据结构实验之求二叉树后序遍历和层次遍历

    数据结构实验之求二叉树后序遍历和层次遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descr ...

  9. sdut 3341数据结构实验之二叉树二:遍历二叉树

    数据结构实验之二叉树二:遍历二叉树 Time Limit: 1000MS Memory Limit: 65536K Problem Description 已知二叉树的一个按先序遍历输入的字符序列,如 ...

最新文章

  1. Android Fragment add/replace以及backstack
  2. Python基础教程:3个方面理解Python的类方法与静态方法
  3. android 上下扫描动画,Android扫描雷达动画
  4. 【JSOI2008】星球大战 (并查集)
  5. JDK源码学习笔记——TreeMap及红黑树
  6. leetcode hot100(第一部分) + python(c++)
  7. STM32 串口接收流程-串口接收中断
  8. mysql触发器_MySQL视图\触发器\事务初步认识
  9. 图解数字签名Digital Signature 和数字证书Public-key certificate
  10. 支付宝首页新增商家服务进度卡片 目前正在灰度测试中
  11. Android中如何解决输入法键盘和activity页面遮挡的问题
  12. 散列函数之双重散列算法解决冲突问题
  13. RxJava2.0——从入门到放弃
  14. # 语音信号处理基础(十)——梅尔倒谱系数
  15. Markdown——让你专注写作
  16. 小米笔记本 镜像_2020年小米笔记本Air 13.3原装WIN10出厂系统ISO镜像1607原版下载...
  17. 盘点市场营销工作中的5个办公神器
  18. java web没有APP流行_简单粗暴,详细得不要不要的 JavaWeb快速入门
  19. C++中的同名二义性和路径二义性
  20. java基于springboot+vue+elementui的实验室预约管理系统 前后端分离

热门文章

  1. S32K344休眠与唤醒配置的一种方法
  2. 蓝桥算法提高ADV-381 分割项链题解
  3. mysql8时区设置_解决MySQL8.0时区的问题步骤
  4. 边缘设备、系统及计算杂谈(17)——Ansible学习
  5. QT信号槽与connect的常见写法
  6. Radxa Rock 3a NPU调用指南
  7. c语言输入f1到f11,我来告诉你:电脑键盘的F1至F12正确用处
  8. 掌财社:Python 机器学习工具包SKlearn的安装与使用
  9. 虚云禅师经典佛教语录大全摘抄
  10. Qt编写输入法V2018超级终结版