#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. percona-5.7二进制多实例安装

    percona-mysql-5.7二进制多实例安装 规划:端口号     配置文件     备注3306 /data/mysql/mysql_3306/my_3306.cnf 3307 /data/m ...

  2. Java多线程常用面试题(含答案,精心总结整理)

    现在有T1.T2.T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行? 目的是检测你对”join”方法是否熟悉.这个多线程问题比较简单,可以用join方法实现. 核心: threa ...

  3. systemd 编写

    转载文章:http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html https://wizardforcel.gitb ...

  4. ElasticSearch的API介绍

    ElasticSearch的API介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.ES是基于Restful风格 1>ES是基于Restful风格 Elasticsea ...

  5. 运维监控-Open-Falcon安装Agent实战篇

    运维监控-Open-Falcon安装Agent实战篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本文参考链接来自:http://book.open-falcon.org/zh/ ...

  6. 网络编程基础【day09】:通过socket实现简单ssh客户端(三)

    本节内容 1.概述 2.socket发送中文 3.重复发送和多次接收 4.模拟ssh客户端 一.概述 本篇博客讲一下,如果socket客户端断了,另外的客户端怎么接入服务端,还有模拟ssh的链接等. ...

  7. linux kill 命令【待完善】【转】

    kill 命令用来处理进程, 在linux中即可使用kill -9 pid 杀死进程 , 也可使用kill -KILL pid 等价的命令来执行. HUP 1 终端断线 INT 2 中断(同 Ctrl ...

  8. UVA - 1401 | LA 3942 - Remember the Word(dp+trie)

    https://vjudge.net/problem/UVA-1401 题意 给出S个不同的单词作为字典,还有一个长度最长为3e5的字符串.求有多少种方案可以把这个字符串分解为字典中的单词. 分析 首 ...

  9. PHP7 学习笔记(十二)Stream 函数详解

    官方:http://php.net/manual/zh/ref.stream.php Stream_*系列函数 PHP中对流的描述如下:每一种流都实现了一个包装器(wrapper),包装器包含一些额外 ...

  10. springboot的lombok

    lombok概述 lombok简介 Lombok想要解决了的是在我们实体Bean中大量的Getter/Setter方法,以及toString, hashCode等可能不会用到,但是某些时候仍然需要复写 ...