博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cc++ leetcode 538.把二叉搜索树转换为累加树
阅读量:3966 次
发布时间:2019-05-24

本文共 1446 字,大约阅读时间需要 4 分钟。

c/c++ leetcode 538.把二叉搜索树转换为累加树

题目描述

难度简单304

给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。

例如:

输入: 原始二叉搜索树:              5            /   \           2     13输出: 转换为累加树:             18            /   \          20     13

**注意:**本题和 1038: https://leetcode-cn.com/problems/binary-search-tree-to-greater-sum-tree/ 相同

解法一.使用递归,反中序遍历

//以从大到小的数进行排列

小的数加上所有比的大的数;

class Solution {public:    int sum = 0;    TreeNode* convertBST(TreeNode* root) {        if  (root == NULL) return NULL;                convertBST(root -> right);        sum += root -> val;        root -> val = sum;        convertBST(root -> left);        return root;    }   };

时空复杂度分析

时间复杂度分析:要遍历整个二叉搜索树,O(N) ; N为树的节点数目;

空间时间复杂度: 最坏情况下开辟N个栈空间为O(N);(二叉树只有右子树或左子树)

解法二,使用stack容器递归

思想与解法一相同;

class Solution {public:    int sum = 0;    TreeNode* convertBST(TreeNode* root) {        if  (root == NULL) return NULL;        TreeNode * curr = root ;        stack
temp; temp.push(root); curr = curr -> right; while (!temp.empty() || curr) { while (curr) { temp.push(curr); curr = curr -> right; } curr = temp.top(); temp.pop(); sum += curr -> val; curr -> val = sum; curr = curr -> left; } return root ; } };

时空复杂度分析

时间复杂度分析:要遍历整个二叉搜索树,O(N) ; N为树的节点数目;

空间时间复杂度: 每个节点都会被压入栈中一次O(N);(二叉树只有右子树或左子树)

转载地址:http://ndyki.baihongyu.com/

你可能感兴趣的文章
docker更换国内镜像
查看>>
CentOS 下 tree命令用法详解
查看>>
docker上传镜像至Registry时https报错解决方法
查看>>
docker下删除none的images
查看>>
Linux提权获取敏感信息方法
查看>>
Ubuntu 16.04开机A start job is running for Raise network interface(5min 4s)解决方法
查看>>
Ubuntu 16.04开机隐藏菜单缩短时间
查看>>
《Linux内核设计与实现》- Linux的进程
查看>>
用户态切换到内核态的3种方式
查看>>
内核库函数
查看>>
Linux 系统内核空间与用户空间通信的实现与分析
查看>>
64位int类型用printf输出问题
查看>>
进程的状态转换
查看>>
如何查看进程的信息(线程数)
查看>>
Linux中的chage命令
查看>>
linux-详细解析密码文件passwd与shadow
查看>>
su- 与su的区别
查看>>
linux下发邮件mail
查看>>
echo如何手动输出换行
查看>>
身份证的正确使用方法——非常重要的知识
查看>>