Cpp 二叉树
#include<vector>
#include<iostream>
using namespace std;
//二叉树的一个节点结构
struct BinaryTreeNode {
int val;
BinaryTreeNode *left;
BinaryTreeNode *right;
BinaryTreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
//使用递归的方法创建二叉树
struct BinaryTreeNode *CreatBinaryTree(){
int a;
cin >> a; //有多少叶子就需要输入2倍个 0 才能结束创建进程
if(a == 0) return NULL;
struct BinaryTreeNode *newnode = (struct BinaryTreeNode*)malloc( sizeof(struct BinaryTreeNode) );
newnode->val = a;
newnode->left = CreatBinaryTree(); //递归创建左子树
newnode->right = CreatBinaryTree(); //递归创建右子树
return newnode;
}
//先序遍历
void PreOrderTraverse(struct BinaryTreeNode *root){
if(root){
cout << root->val << ' ';
PreOrderTraverse(root->left);
PreOrderTraverse(root->right);
}
}
//中序遍历
void InOrderTraverse(struct BinaryTreeNode *root){
if(root){
InOrderTraverse(root->left);
cout << root->val << ' ';
InOrderTraverse(root->right);
}
}
//后序遍历
void LastOrderTraverse(struct BinaryTreeNode *root){
if(root){
LastOrderTraverse(root->left);
LastOrderTraverse(root->right);
cout << root->val << ' ';
}
}
//层次遍历,使用队列,按照层级分别保存
void LevelOrderTraverse(BinaryTreeNode* root, int depth, vector<vector<int>> &result) {
if(root==NULL) return;
if(depth >= result.size()) result.push_back(vector<int>{});
result[depth].push_back(root->val);
LevelOrderTraverse(root->left, depth + 1, result);
LevelOrderTraverse(root->right, depth + 1, result);
}
void LevelOrderTraverse(BinaryTreeNode* root) {
vector<vector<int>> result;
LevelOrderTraverse(root, 0, result);
for(auto line:result){
for(auto e:line) cout<<e<<' ';
cout<<endl;
}
}
//二叉树节点总数目
int NodeNum(struct BinaryTreeNode *root){
if(root)
return 1+NodeNum(root->left)+NodeNum(root->right);
else
return 0;
}
//二叉树叶子节点数
int LeafNum(struct BinaryTreeNode *root){
if(!root)
return 0;
else if( (root->left == NULL) && (root->right == NULL) )
return 1;
else
return LeafNum(root->left) + LeafNum(root->right);
}
//二叉树最大深度
int maxDepth(struct BinaryTreeNode *root){
if(root == NULL) return 0;
return max(maxDepth(root->left), maxDepth(root->right)) + 1;
}
//二叉树最小深度(从根节点到最近叶子节点,注意是叶子)
int minDepth(struct BinaryTreeNode *root){
if(root == NULL) return 0;
if(root->left == NULL) return minDepth(root->right) + 1;
if(root->right == NULL) return minDepth(root->left) + 1;
return min(minDepth(root->left), minDepth(root->right)) + 1;
}
//二叉树所用路径
void binaryTreePaths(BinaryTreeNode* node,string path,vector<string> &result){
path += to_string(node->val);
//遍历到子节点了,
if(node->left==NULL && node->right==NULL) result.push_back(path);
if(node->left!=NULL) binaryTreePaths(node->left, path + "->",result);
if(node->right!=NULL) binaryTreePaths(node->right,path + "->",result);
}
vector<string> binaryTreePaths(BinaryTreeNode* root) {
vector<string> result;
if(root!=NULL) binaryTreePaths(root,"",result);
return result;
}
int main(){
struct BinaryTreeNode *root;
root = CreatBinaryTree();
cout<<"二叉树总节点数为:"<<NodeNum(root)<<endl;
cout<<"二叉树叶子节点数为:"<<LeafNum(root)<<endl;
cout<<"二叉树最大深度(从根节点到最远叶子节点):"<<maxDepth(root)<<endl;
cout<<"二叉树最小深度(从根节点到最近叶子节点):"<<minDepth(root)<<endl;
cout<<"前序遍历结果:";
PreOrderTraverse(root);
cout<<endl;
cout<<"中序遍历结果:";
InOrderTraverse(root);
cout<<endl;
cout<<"后序遍历结果:";
LastOrderTraverse(root);
cout<<endl;
cout<<"层次遍历结果:\n";
LevelOrderTraverse(root);
cout<<endl;
cout<<"二叉树所有路径:\n";
vector<string> allPaths = binaryTreePaths(root);
for(auto e:allPaths) cout <<"\t" << e <<endl;
return 0;
}
/*
测试用例:
3 9 0 0 20 15 0 0 7 0 0
3 9 15 0 0 7 0 0 20 0 0
1 2 0 5 0 0 3 0 0
*/
Cpp 二叉树的更多相关文章
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- 48. 二叉树两结点的最低共同父结点(3种变种情况)[Get lowest common ancestor of binary tree]
[题目] 输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点. 二叉树的结点定义如下: C++ Code 123456 struct BinaryTreeNode { int ...
- 二叉树建立,遍历和二叉排序树的判断【c++】
// test.cpp : Defines the entry point for the console application. // #include "stdafx.h" ...
- 巧妙地用二叉树完成算式计算算法<计算器,二叉树,C++,独辟蹊径>
#01.引言,我们知道算式计算的问题是栈里面一个非常经典的题目.但是用栈来实现是一个非常麻烦的过程,第一要解决算式判断,是否为符合规则的算式,第二要由中最表达式转化为后缀表达式.这两个部分是栈实现计算 ...
- 洛谷U4727小L的二叉树[树转序列 LIS]
题目背景 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣. 所以,小L当时卡在了二叉树. 题目描述 在计算机科学中,二叉树是每个结点最多有两个子结点的 ...
- NOIP2003加分二叉树[树 区间DP]
题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...
- 数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树
一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈 ...
- 树(二)——二叉树
目录 本章主要讲解内容为: 树的非递归遍历算法,两种版本 树的扩展前缀以及前缀中缀构建方法 源码 btree.cpp btree.h 基础知识 一.定义 二叉树的递归定义:二叉树是每个结点最多含有两棵 ...
- C++实现二叉树,运用模板,界面友好,操作方便 运行流畅
//.h文件 #ifndef TREE_H #define TREE_H #include<iostream> #include<iomanip> using namespac ...
随机推荐
- HTTP与FILE协议的区别
File协议 file协议(本地文件传输协议)主要是用来访问本地计算机的文件,一般用Windows的资源管理器直接打开进行读取一个HTML文件时,默认会使用file协议 基本格式是: file:/// ...
- 使用objc runtime实现iOS绿色的懒加载
使用objc runtime实现懒加载 地址:AutoPropertyCocoa 本文所指懒加载形式如下 - (id)lazyloadProperty{ if(_lazyloadProperty == ...
- Android五大布局详解——TableLayout(表格布局)
TableLayout 前面所学的LinearLayout和RelativeLayout两大布局已经完全适用于各种开发条件下,其他的布局仅供参考学习,毕竟知识就是力量,以后的开发过程中万一遇到也能游刃 ...
- How to use special characters in XML?
https://dvteclipse.com/documentation/svlinter/How_to_use_special_characters_in_XML.3F.html Because X ...
- OpenTSDB 简单使用 .NET
OpenTSDB是基于Hbase的时序数据库[时间序列数据库].不具备通用性,主要针对具有时间特性和需求的数据,如监控数据.温度变化数据等. 1.安装OpenTSDB 安装前一定要安装HBase,相关 ...
- VMware虚拟机Linux配置
1.设置时区和时间 打开虚拟机,设置好用户名和密码,就可以进入了. 进入之后,可以先设置时区和时间 在CentOS桌面右上角,点击时间,然后进行设置 2.添加用户使用root权限 安装虚拟机之后,登录 ...
- python 基础学习笔记(5)--文件操作
**python 的文件操作** - [ ] 使用python来读写文件是非常简单的操作,我们使用open()来打开一个文件,获取到文件的语柄,然后通过文件语柄就可以进行各种各样的操作了. - [ ] ...
- Spring源码解析-ioc容器的设计
Spring源码解析-ioc容器的设计 1 IoC容器系列的设计:BeanFactory和ApplicatioContext 在Spring容器中,主要分为两个主要的容器系列,一个是实现BeanFac ...
- 计算机网络知识之TCP/IP协议簇
OSI参考模型 OSI的来源 OSI(Open System Interconnect),即开放式系统互联. 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网 ...
- log4j日志打印的配置文件简单使用
log4j.properties #将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码 log4j.rootLogger=DEBUG,c ...