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 ...
随机推荐
- MySQL Aborted_clients和 Aborted_connects状态变量详解
Aborted_clients和 Aborted_connects状态变量详解 By:授客 QQ:1033553122 状态变量定义 Aborted_clients 因客户端消亡时未恰当的关闭连接 ...
- CODING 受邀参与 DevOps 标准体系之系统和工具&技术运营标准技术专家研讨会
2019 年 5 月 24-25 日,国内领先的一站式 DevOps 解决方案供应商 CODING 作为腾讯云的深度合作伙伴,受邀参加在成都举行的由 TC608 云计算标准和开源推进委员会主办,中国信 ...
- Tornado—接口调用时方法执行顺序
import tornado.web # web服务 import tornado.ioloop # I/O 时间循环 class MainHandler(tornado.web.RequestHan ...
- python(一) jupyter 安裝
copy from https://jupyter.org/install Getting started with JupyterLab Installation JupyterLab can be ...
- Hazelcast介绍
Hazelcast介绍 什么时侯需要用例 内存中分布式计算 场景分布式消息 特性 全景 Distributed Maps 一个结点中分区 Hazelcast中的分片也称为分区,Hazelcast默认2 ...
- div块水平居中,垂直居中
水平居中一个div想要水平居中于它的父div中只需要给它加css属性margin:0 auto; 即可 <!DOCTYPE html> <html> <head> ...
- SpringCloud学习笔记(十一、SpringCloud总结)
SpringCloud Config: 1.动态刷新配置:通过job调用Set<String> keys = contextRefresher.refresh()这段代码即可. 2.如何实 ...
- 关于eclipse的maven项目Java Build Path中maven依赖报错问题
场景描述: respository仓库位置变动过,代码注解等报错 解决方法: 选中项目,点击maven ->update Project即可.
- BOM的初级理解
1.什么是BOM,BOm有什么作用? BOM和DOM.ES是JavaScript的重要三个组成部分: 其中BOM是专门操作浏览器的API,其实他就是一种兼容性问题,这其中问题比较大就是IE浏览器,谁叫 ...
- Python爬虫基础——HTML、CSS、JavaScript、JQuery网页前端技术
一.HTML HTML是Hyper Text Markup Language(超文本标记语言)的缩写. HTML不是一种编程语言,而是标记语言. HTML的语法 双标签: 单标签: HTML的元素和属 ...