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 ...
随机推荐
- English:Day-to-day 1015
device session stroll pants & trousers gist deep depth diameter D radius R merge ..
- 记,NSProxy需要实现哪些方法?
转注出:https://www.cnblogs.com/xiaobajiu/p/10799962.html 使用NSProxy做替身,代理,多继承,本质上都是用它来转发消息给真身. 观察头文件,NSP ...
- 3、nio中的selector使用
通过编写一个客户端和服务器端的例子来熟悉selector的使用 服务端逻辑: 1. 绑定一个端口号2. channel注册到selector中3. 用死循环来监听如果有时间发生,遍历selection ...
- [C]链接和生存周期
链接和生存周期的区别: 链接是标识符的属性: 生存周期是对象的属性: 链接可以是外部(external),内部(internal)或没有(none): 生存周期可以是自动的.静态的,或已分配的(all ...
- 【oracle】ORA-00947: 没有足够的值
insert 时 对应NOT NULL 的列 必须有值
- Java之ssh框架spring配置文件配置定时任务
最近做了一个数据同步功能,要求晚上0点去定时同步数据,这是个老项目框架用的ssh,定时任务基于quartz,废话不多说,下面详细说说相关配置. 在spring的配置文件中: <!-- 0点定时任 ...
- Python 从入门到进阶之路(七)
之前的文章我们简单介绍了一下 Python 中异常处理,本篇文章我们来看一下 Python 中 is 和 == 的区别及深拷贝和浅拷贝. 我们先来看一下在 Python 中的双等号 == . == 是 ...
- Python 调用 Hprose接口、Dubbo接口、Java方法
#!/usr/bin/env python # -*- coding:utf-8 -*- # ************************************* # @Time : 2019/ ...
- JAVA集合框架(二)-List和Set
List的常用实现类 list集合是有序的,顺序即添加的顺序,元素是可重复的. ArrayList LinkedList Vector ArrayList 底层基于数组实现.在add元素的过程中,如果 ...
- SpringBoot整合Thymeleaf表单更新操作
对于表单值回显并更新的逻辑相比大家都已经很熟悉了, 但是我们操作Thymeleaf的话这里就会有一点小坑了, 在要回显值的表单的所有字段上,我们都要加上 th:field,才可以完成回显值更新 或者这 ...