二叉树基本操作C++
#include <cstdio>
#include <climits>
#include <cassert>
#include <iostream>
#include <algorithm>
#include <string> struct Node {
int value = ;
struct Node *left = nullptr;
struct Node *right = nullptr;
}; void preorder_print_aux(Node *T) {
if (T == nullptr) {
return ;
}
std::cout << T->value << ' ';
preorder_print_aux(T->left);
preorder_print_aux(T->right);
} void preorder_print(Node *T) {
preorder_print_aux(T);
std::cout << std::endl;
} Node *CreateBiTreeAux(Node *&T, std::vector<int>::const_iterator &ite) {
// 按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树,
// 构造二叉链表表示的二叉树T。
int elem = *ite++; if (elem == INT_MIN) {
T = nullptr;
} else {
T = new Node;
T->value = elem; // 生成根结点
CreateBiTreeAux(T->left, ite); // 构造左子树
CreateBiTreeAux(T->right, ite); // 构造右子树
}
return T;
} Node *create_tree(Node *&T, const std::vector<int> &input) {
std::vector<int>::const_iterator ite = input.begin();
CreateBiTreeAux(T, ite); return T;
} void free(Node *&T)
{
if (T == nullptr)
return; free(T->left);
free(T->right);
delete T;
T = nullptr;
} int sum(struct Node *tree, int *max_sum) {
if (tree->left == nullptr && tree->right == nullptr) {
*max_sum = tree->value;
return tree->value;
} int left_sum = INT_MIN;
int l_max_sum = INT_MIN;
if (nullptr != tree->left) {
left_sum = sum(tree->left, &l_max_sum);
} int right_sum = INT_MIN;
int r_max_sum = INT_MIN;
if (nullptr != tree->right) {
right_sum = sum(tree->right, &r_max_sum);
} int ret = tree->value + left_sum + right_sum;
if (ret < l_max_sum) {
ret = l_max_sum;
}
if (ret < r_max_sum) {
ret = r_max_sum;
} *max_sum = ret;
return ret;
} void assert_equal(int expect, std::vector<int> tree) {
Node *T = nullptr;
create_tree(T, tree);
preorder_print(T);
int ret = ;
sum(T, &ret);
if (expect != ret) {
fprintf(stderr, "Expect %d, but result is %d.\n", expect, ret);
exit();
}
free(T);
} int main() {
assert_equal(, {, INT_MIN, INT_MIN});
assert_equal(, {, , INT_MIN, INT_MIN, , INT_MIN, INT_MIN});
assert_equal(, {, -, INT_MIN, INT_MIN, , INT_MIN, INT_MIN});
assert_equal(, {-, , -, INT_MIN, INT_MIN, , INT_MIN, INT_MIN, , INT_MIN, INT_MIN});
assert_equal(, {-, -, -, INT_MIN, INT_MIN, , INT_MIN, INT_MIN, -, INT_MIN, INT_MIN}); std::cout << "OK\n"; return ;
}
二叉树基本操作C++的更多相关文章
- c++学习笔记—二叉树基本操作的实现
用c++语言实现的二叉树基本操作,包括二叉树的创建.二叉树的遍历(包括前序.中序.后序递归和非递归算法).求二叉树高度,计数叶子节点数.计数度为1的节点数等基本操作. IDE:vs2013 具体实现代 ...
- c语言二叉树基本操作
编译器为vs2013 #include "stdafx.h" #include<malloc.h> #include<stdlib.h> #define O ...
- 二叉树基本操作C代码
#include<stdio.h> #include<malloc.h> #define LEN sizeof(struct ChainTree) struct ChainTr ...
- c++(排序二叉树线索化)
前面我们谈到了排序二叉树,还没有熟悉的同学可以看一下这个,二叉树基本操作.二叉树插入.二叉树删除1.删除2.删除3.但是排序二叉树也不是没有缺点,比如说,如果我们想在排序二叉树中删除一段数据的节点怎么 ...
- 基于Java实现红黑树的基本操作
首先,在阅读文章之前,我希望读者对二叉树有一定的了解,因为红黑树的本质就是一颗二叉树.所以本篇博客中不在将二叉树的增删查的基本操作了,需要了解的同学可以到我之前写的一篇关于二叉树基本操作的博客:htt ...
- Leetcode#106 Construct Binary Tree from Inorder and Postorder Traversal
原题地址 二叉树基本操作 [ ]O[ ] [ ][ ]O 代码: TreeNode *restore(vector<i ...
- 07. Go 语言接口
Go 语言接口 接口本身是调用方和实现方均需要遵守的一种协议,大家按照统一的方法命名参数类型和数量来协调逻辑处理的过程. Go 语言中使用组合实现对象特性的描述.对象的内部使用结构体内嵌组合对象应该具 ...
- cb23a_c++_标准模板库STL_set_multiset_关联容器
cb23a_c++_标准模板库STL_set_multiset_关联容器 set(集)数据不能重复.multiset(多集)可以重复.操作数据速度快,数据自动排序.红黑树(数据结构)红黑树-二叉树基本 ...
- cb22a_c++_标准模板库_STL_map_multimap红黑树(数据结构)关联容器
cb22a_c++_标准模板库_STL_map_multimap红黑树(数据结构)关联容器map(映射,key不能重复,一对一对的,value_type(1, "one")),mu ...
随机推荐
- ubuntu 13.10 svn工具 rabbitvcs 安装
ubuntu 版本:13.10:桌面模式默认:unity :文件管理器:nautilus
- unity 读取文本与写入文本
void writeData(string str,string file) { string parth = Application.dataPath; Strea ...
- 剑指Offer:面试题34——丑数(java实现)
问题描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 思路1: ...
- Tableau 地图无法识别怎么办
Tableau地图是一个很优秀的工具,可以选择城市或者省份作为单位来显示地图. 前几天做了一个省份的感觉很好,今天用城市做单位居然有些城市识别不了,其中包括贵阳和宿迁. 换了拼音之后贵阳能够识别了 ...
- Android狂记忆
虽然说技术人员偏爱实战,而不屑理论或记忆,但实战之前,若是记忆一些知识,开发起来将会如虎添翼,不说了,开始狂记吧! Android 系统包说明: android.app :提供高层的程序模型.提供基 ...
- 使用archlinux作为日常开发机已经半年了,随便写一下
机器配置 CPU: Intel Core i5-6200U CPU @ 2.8GHz RAM: 6114MiB / 7421MiB Resolution: 1920x2160 在arch下常用的软件 ...
- 答:SQLServer DBA 三十问之五:有关视图索引
5. 视图上我们能建索引吗,如果能建的话,会啥好处和坏处:视图上建索引和表上建索引有啥区别: ----------------------------------------------------- ...
- ShellExecute —— 运行一个外部程序
原型参数 注意事项:使用该函数时,需添加该头文件:[1] #include <shellapi.h> ShellExecute函数原型及参数含义如下: ShellExecute( hWn ...
- 过渡transitioin
一,什么是过渡(transition)? 1,transition 允许 CSS 元素的属性值在一定的时间区间内平滑地过渡. 2,可以在不使用 Flash 动画或 JavaScript 的情况下,在元 ...
- nice-validator验证插件
主要是作为form表单的验证,密码,确认密码的验证,远程验证的功能: 1:先导包:nice-validator 2:引入文件css,js 3: 使用 使用文档:http://www.niceue.co ...