#include <iostream>
using namespace std; //树的存储结构与设计
struct BitNode
{
int data;
BitNode* leftChild;
BitNode* rightChild;
BitNode()
{
leftChild = NULL;
rightChild = NULL;
}
BitNode(int x) :data(x), leftChild(NULL), rightChild(NULL)
{ }
};
//树的先序遍历
void PreOrder(BitNode* T)
{
if (T == NULL)
{
return;
}
cout << T->data;
PreOrder(T->leftChild);
PreOrder(T->rightChild);
return; }
//树的中序遍历
void InOrder(BitNode* T)
{
if (T == NULL)
{
return;
}
InOrder(T->leftChild);
cout << T->data;
InOrder(T->rightChild);
return;
}
//树的后序遍历
void PostOrder(BitNode* T)
{
if (T == NULL)
{
return;
}
PostOrder(T->leftChild);
PostOrder(T->rightChild);
cout << T->data;
}
//求树的叶子结点个数
int sum = ;
int CountLeafNum(BitNode* T)
{ if (T == NULL)
{
return ;
}
if (T->leftChild == NULL && T->rightChild == NULL)
{
sum++;
}
CountLeafNum(T->leftChild);
CountLeafNum(T->rightChild);
return sum;
}
//求树的叶子结点个数-两个参数
void CountLeafNum(BitNode* T, int* sum)
{
if (T == NULL)
{
return;
}
if (T->leftChild == NULL && T->rightChild == NULL)
{
*sum = *sum + ; //等价于(*sum)++
}
CountLeafNum(T->leftChild, sum);
CountLeafNum(T->rightChild, sum);
}
//求树的深度
int DepthOfTree(BitNode* T)
{
int depthLeft = ;
int depthRight = ;
int depth = ;
if (T == NULL)
return ;
depthLeft = DepthOfTree(T->leftChild);
depthRight = DepthOfTree(T->rightChild);
depth = + ((depthLeft >depthRight)? depthLeft : depthRight);
return depth;
}
//复制二叉树--用递归的思想,必须先根据返回值,定义新的变量类型用于递归的返回值赋值
BitNode* Copy(BitNode* T)
{
if (T == NULL)
{
return NULL;
}
//用的前序遍历思想
BitNode* newTreeLeft = Copy(T->leftChild);
BitNode* newTreeRight = Copy(T->rightChild); //建立一个结点
BitNode* newNode = new BitNode();
if (newNode == NULL)
{
return NULL;
}
newNode->data = T->data;
newNode->leftChild = newTreeLeft;
newNode->rightChild = newTreeRight;
return newNode;
}
int main()
{
BitNode nodeA();
BitNode nodeB();
BitNode nodeC();
BitNode nodeD();
BitNode nodeE();
BitNode nodeF(); nodeA.leftChild = &nodeB;
nodeA.rightChild = &nodeC;
nodeB.leftChild = &nodeD;
nodeB.rightChild = &nodeE;
nodeC.leftChild = &nodeF; //前序遍历二叉树
cout << "前序遍历二叉树 " << ":";
PreOrder(&nodeA);
cout << endl;
//中序遍历二叉树
cout << "中序遍历二叉树 " << ":";
InOrder(&nodeA);
cout << endl;
//后序遍历二叉树
cout << "后序遍历二叉树 " << ":";
PostOrder(&nodeA);
cout << endl; //树的结点个数
int leafCount = CountLeafNum(&nodeA);
cout << "树的结点个数:" << leafCount << endl; //树的深度
int depth = DepthOfTree(&nodeA);
cout << "树的深度:" << depth << endl; //赋值一棵树
BitNode* newNode = Copy(&nodeA);
//后序遍历二叉树
cout << "后序遍历二叉树 " << ":";
PostOrder(newNode);
cout << endl; system("pause");
return ;
}

关于树的常见操作-C++面试的更多相关文章

  1. C#路径/文件/目录/I/O常见操作汇总

    文件操作是程序中非常基础和重要的内容,而路径.文件.目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题,尽量提供一些解决方案,即使没有你想要的答案,也希望能提供 ...

  2. C#路径/文件/目录/I/O常见操作汇总<转载>

    文件操作是程序中非常基础和重要的内容,而路径.文件.目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题,尽量提供一些解决方案,即使没有你想要的答案,也希望能提供 ...

  3. 【转】C#路径/文件/目录/I/O常见操作汇总

    文件操作是程序中非常基础和重要的内容,而路径.文件.目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题,尽量提供一些解决方案,即使没有你想要的答案,也希望能提供 ...

  4. C#路径,文件,目录,I/O常见操作

         C#路径,文件,目录,I/O常见操作 文件操作是程序中非常基础和重要的内容,而路径.文件.目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题,尽量提供 ...

  5. JS 数组常见操作汇总,数组去重、降维、排序、多数组合并实现思路整理

    壹 ❀ 引 JavaScript开发中数组加工极为常见,其次在面试中被问及的概率也特别高,一直想整理一篇关于数组常见操作的文章,本文也算了却心愿了. 说在前面,文中的实现并非最佳,实现虽然有很多种,但 ...

  6. 动态单链表的传统存储方式和10种常见操作-C语言实现

    顺序线性表的优点:方便存取(随机的),特点是物理位置和逻辑为主都是连续的(相邻).但是也有不足,比如:前面的插入和删除算法,需要移动大量元素,浪费时间,那么链式线性表 (简称链表) 就能解决这个问题. ...

  7. X-Cart 学习笔记(四)常见操作

    目录 X-Cart 学习笔记(一)了解和安装X-Cart X-Cart 学习笔记(二)X-Cart框架1 X-Cart 学习笔记(三)X-Cart框架2 X-Cart 学习笔记(四)常见操作 五.常见 ...

  8. 转:jQuery 常见操作实现方式

    http://www.cnblogs.com/guomingfeng/articles/2038707.html 一个优秀的 JavaScript 框架,一篇 jQuery 常用方法及函数的文章留存备 ...

  9. jQuery 常见操作实现方式

    一个优秀的 JavaScript 框架,一篇 jQuery 常用方法及函数的文章留存备忘. jQuery 常见操作实现方式 $("标签名") //取html元素 document. ...

随机推荐

  1. Go数据类型和变量

    一:Go数据类型 1.1 Go语言按照分类有以下几种数据类型 布尔型 布尔型的是一个常量true或者false 数字类型 整型int和浮点型 float32, float64 字符串类型 字符串就是一 ...

  2. IO以及file的一些基本方法

    IO定义:将内存的数据 持久化到设备上 这个动作称为输出 写 Output操作 把硬盘上的数据读取到内存 这个动作称为输入 读 Input 把上面这两种操作称为IO操作 File类的静态成员变量:pa ...

  3. rabbitMQ 3.6.15生产环境

    服务器配置 系统环境:CentOS 7 由于RabbitMQ依赖erlang, 所以需要先安装erlang 下载erlang 下载地址 http://erlang.org/download/ linu ...

  4. SpringCloud之注册中心Eureka搭建

    POM: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring ...

  5. gometalinter代码质量检查分析工具(golang)

    GitHub地址:https://github.com/alecthomas/gometalinter gometalinter安装和使用 1.安装 go get github.com/alectho ...

  6. MySQL_参数设置

    1.max_allowed_packet 描述:有时备份数据库时,将本地psc文件备份到数据库时,会遇见备份不成功的情况 分析:这时要考虑,是否由于max_allowed_packet这个参数过小,导 ...

  7. 《Apache Kafka 实战》读书笔记-认识Apache Kafka

    <Apache Kafka 实战>读书笔记-认识Apache Kafka 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.kafka概要设计 kafka在设计初衷就是 ...

  8. Java 微信公众号导出所有粉丝(openId)

    由于公众号换了公司主体,需要做迁移,玩家的openId数据需要做处理. (我是按我要的json格式,将粉丝导成了1万条数据的一个json文件) 文件格式: { "info":[ { ...

  9. bzoj千题计划323:bzoj1951: [Sdoi2010]古代猪文(Lucas+CRT+欧拉定理)

    https://www.lydsy.com/JudgeOnline/problem.php?id=1951 先欧拉降幂 然后模数质因数分解 分别计算组合数的结果,中国剩余定理合并 #include&l ...

  10. 关于selenium的那些坑

    selenium 辅助工具 splinter 总有人看不明白,以防万一,先在开头大写加粗说明一下: frameset不用切,frame需层层切! 很多人在用selenium定位页面元素的时候会遇到定位 ...