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

  1. c++学习笔记—二叉树基本操作的实现

    用c++语言实现的二叉树基本操作,包括二叉树的创建.二叉树的遍历(包括前序.中序.后序递归和非递归算法).求二叉树高度,计数叶子节点数.计数度为1的节点数等基本操作. IDE:vs2013 具体实现代 ...

  2. c语言二叉树基本操作

    编译器为vs2013 #include "stdafx.h" #include<malloc.h> #include<stdlib.h> #define O ...

  3. 二叉树基本操作C代码

    #include<stdio.h> #include<malloc.h> #define LEN sizeof(struct ChainTree) struct ChainTr ...

  4. c++(排序二叉树线索化)

    前面我们谈到了排序二叉树,还没有熟悉的同学可以看一下这个,二叉树基本操作.二叉树插入.二叉树删除1.删除2.删除3.但是排序二叉树也不是没有缺点,比如说,如果我们想在排序二叉树中删除一段数据的节点怎么 ...

  5. 基于Java实现红黑树的基本操作

    首先,在阅读文章之前,我希望读者对二叉树有一定的了解,因为红黑树的本质就是一颗二叉树.所以本篇博客中不在将二叉树的增删查的基本操作了,需要了解的同学可以到我之前写的一篇关于二叉树基本操作的博客:htt ...

  6. Leetcode#106 Construct Binary Tree from Inorder and Postorder Traversal

    原题地址 二叉树基本操作 [       ]O[              ] [       ][              ]O 代码: TreeNode *restore(vector<i ...

  7. 07. Go 语言接口

    Go 语言接口 接口本身是调用方和实现方均需要遵守的一种协议,大家按照统一的方法命名参数类型和数量来协调逻辑处理的过程. Go 语言中使用组合实现对象特性的描述.对象的内部使用结构体内嵌组合对象应该具 ...

  8. cb23a_c++_标准模板库STL_set_multiset_关联容器

    cb23a_c++_标准模板库STL_set_multiset_关联容器 set(集)数据不能重复.multiset(多集)可以重复.操作数据速度快,数据自动排序.红黑树(数据结构)红黑树-二叉树基本 ...

  9. cb22a_c++_标准模板库_STL_map_multimap红黑树(数据结构)关联容器

    cb22a_c++_标准模板库_STL_map_multimap红黑树(数据结构)关联容器map(映射,key不能重复,一对一对的,value_type(1, "one")),mu ...

随机推荐

  1. 规则引擎集成接口(四)SQL执行语句

    SQL执行语句 右键点击数据库连接文件“hr”—“添加SQL执行语句”,如下图: 弹出窗体,如下图: 将显示名称改为“部门名称”,返回至类型设置为“string”,在编写sql语句,如下图: 点击确定 ...

  2. session保存用户信息

    前台jsp-------------- <%@ page import="com.manager.form.User" %><%User user = reque ...

  3. java.lang.OutOfMemoryError: Java heap space解决办法

    进入到tomcat/bin目录下,编辑catalina.bat,在这个文件最前面加入一句:set JAVA_OPTS=-Xms384m -Xmx384m 保存退出,重启tomcat服务即可. 该异常应 ...

  4. This kind of launch is configured to open the Debug perspective when it suspends.

    This kind of launch is configured to open the Debug perspective when it suspends. 因为设置了断点才会弹出这个,不需要调 ...

  5. SBCL 从REPL 中提取lisp代码

    1, 在emacs C-x C-W 文件另存为保存所有REPL过程 由于 (load "foo.lisp")时只有定义语句可以正确执行, 执行语句不可正确被 (load " ...

  6. 缩略信息是: sending message to a Handler on a dead thread 我是用IntentService时报的

    稍微纤细一点儿的信息是: Handler (android.os.Handler) {215ddea8} sending message to a Handler on a dead thread. ...

  7. CSS3 动画实现 animation 和 transition 比较

    在 CSS3 中有两种方式实现动画, 分别是 animation 和 transition, 他们都有以下功能 根据特定 CSS 属性进行动画 设定属性变化的 timing function 设定动画 ...

  8. 使用es6的set和map实现数组去重复

    var set = new Set();var arr = [1, 2, 3, 3, 2, 1];arr.map(val => set.add(val));// arr.map(function ...

  9. 解决Debian系统的Crontab执行时间时差问题

    首先用 * * * * * date >> /root/log.log 做个测试,发现显示的是UTC的时间,但是直接执行date,得到的是CST的时间.可见在Debian里crontab的 ...

  10. C--变量的命名规则

    规则1.标识符最好采用英文单词或其组合,不允许使用拼音. 规则3.当标识符由多个词组成时,每个词的第1个字母大写,其余全部小写: int   CurrentVal; 规则5.对在多个文件之间共同使用的 ...