#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 二叉树的更多相关文章

  1. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  2. 48. 二叉树两结点的最低共同父结点(3种变种情况)[Get lowest common ancestor of binary tree]

    [题目] 输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点. 二叉树的结点定义如下:  C++ Code  123456   struct BinaryTreeNode {     int ...

  3. 二叉树建立,遍历和二叉排序树的判断【c++】

    // test.cpp : Defines the entry point for the console application. // #include "stdafx.h" ...

  4. 巧妙地用二叉树完成算式计算算法<计算器,二叉树,C++,独辟蹊径>

    #01.引言,我们知道算式计算的问题是栈里面一个非常经典的题目.但是用栈来实现是一个非常麻烦的过程,第一要解决算式判断,是否为符合规则的算式,第二要由中最表达式转化为后缀表达式.这两个部分是栈实现计算 ...

  5. 洛谷U4727小L的二叉树[树转序列 LIS]

    题目背景 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣. 所以,小L当时卡在了二叉树. 题目描述 在计算机科学中,二叉树是每个结点最多有两个子结点的 ...

  6. NOIP2003加分二叉树[树 区间DP]

    题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...

  7. 数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树

    一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈 ...

  8. 树(二)——二叉树

    目录 本章主要讲解内容为: 树的非递归遍历算法,两种版本 树的扩展前缀以及前缀中缀构建方法 源码 btree.cpp btree.h 基础知识 一.定义 二叉树的递归定义:二叉树是每个结点最多含有两棵 ...

  9. C++实现二叉树,运用模板,界面友好,操作方便 运行流畅

    //.h文件 #ifndef TREE_H #define TREE_H #include<iostream> #include<iomanip> using namespac ...

随机推荐

  1. Cocos Creator | 炮弹发射效果模拟

    一.预览效果 ​ 二.设置物理世界属性: 1.打开物理系统: cc.director.getPhysicsManager().enabled = true; 2. 配置重力加速度: cc.direct ...

  2. golang的缓冲channel简单使用

    目录 golang的缓冲channel简单使用 阻塞型 非阻塞 golang的缓冲channel简单使用 我们常用的是无缓冲channel : make(chan type) 其实make() 创建c ...

  3. ProjectServer2010升级到ProjectServer2016,Sharepoint2010升级到Sharepoint2016第一章

    之后还原 Project Server 2010 数据库和包含 Project Web App 网站数据的 SharePoint 内容数据库,您可以运行数据和 Project Web App 网站集升 ...

  4. [转]UiPath Deployment Architecture

    本文转自:https://dotnetbasic.com/2019/08/uipath-deployment-architecture.html We will learn step by step ...

  5. Sunset: Vulnhub Walkthrough

    主机扫描: ╰─ nmap -p1-65535 -sV -A 10.10.202.147 PORT STATE SERVICE VERSION21/tcp open ftp pyftpdlib 1.5 ...

  6. OPENGL 坐标轴转换

    坐标轴 平移 旋转 缩放 重置坐标轴 矩阵操作 示例 1.坐标轴  OpenGL 使用的右手坐标系,从正面看原点,逆时针旋转被认为是正旋转. x轴:从左到右 y轴:从底部向上 z轴:从屏幕背向朝向前方 ...

  7. Windows7安装PowerShell5.1方法(Flutter新版本需要)

    Windows7安装PowerShell5.1方法(Flutter新版本需要)   重新安装Windows7系统,在使用Flutter的时候,发现需要PowerShell5.0以上版本,需要升级Win ...

  8. 【pycharm】Unable to save settings: Failed to save settings. Please restart PyCharm解决

    1.Unable to save settings: Failed to save settings. Please restart PyCharm解决 将工程的.idea目录删掉,重启pycharm ...

  9. No package gcc48-c++ available

    yum install gcc48-c++ linux 下编译安装 rocksdb,发现没有这个 gcc48-c++,感觉这个48 应该是版本号,于是在 yum install gcc-c++,安装成 ...

  10. Go 数组(array) & 切片(slice)

    数组 数组是一组固定长度的序列 数组类型 数组的类型不仅和储存元素的类型有关,还和数组长度有关,不同长度的数组是不同的类型 不同类型的数组不能共用一个函数 func main() { var a [1 ...