[538 Convert BST to Greater Tree]搜索二叉树的数值计算

本文介绍了一种针对二叉搜索树的转换算法,通过特定的遍历方式更新每个节点的值,使其等于所有大于该节点值的节点之和。详细解析了算法的思路,并给出了C++代码实现。

一、题目解析

给定一个搜索二叉树,然后将该搜索树的每一个节点Node[i]进行转换,其中具体转换规则为每一个节点的新值等于该二叉搜索树中所有比他大的节点值与其本身值的和,依次将该二叉树的每一个节点值按照以上规则进行重新计算,输出新二叉树的根节点,详情举例如下:

Input: The root of a Binary Search Tree like this:
              5
            /   \
           2     13

Output: The root of a Greater Tree like this:
             18
            /   \
          20     13
二、思路解析

搜索二叉树有着非常明显的特点,即右节点值大于根节点值大于左节点值,由于每个节点的新值为所有大于节点值与其本身的节点值和,因此遍历顺序依次为右节点、根节点、左节点。计算过程在根节点处进行,设置一个变量temp,该变量存储当前节点之前所有遍历节点的和,具体算法实现如下。

三、代码实现

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* convertBST(TreeNode* root) {
       travel(root);
       return root;
    }
    TreeNode* travel(TreeNode* root) {
         if(!root) {
            return 0;
        }
        if(root->right) {
          travel(root->right);
        }
        temp += root->val;
        root->val = temp;
        if(root->left) {
            travel(root->left);
        }
        return root;
    }
private:
    int temp = 0;
};


代码下载链接: https://pan.quark.cn/s/a4b39357ea24 第 一 章 概述 1-1 简述计算机程序设计语言的发展阶段。 解: 自从计算机诞生以来,程序设计语言经历了从机器语言、汇编语言到高级语言的演变过程,C++语言作为一种面向对象的编程语言,也属于高级语言范畴。 1-2 面向对象的编程语言具备哪些特性? 解: 面向对象的编程语言与传统的编程语言有着本质的区别,其设计初衷是为了更直观地模拟现实世界中存在的事物及其相互关系。这类编程语言将客观事物视为具有属性和行为的对象,通过抽象方法提取出同一类对象的共同属性(静态特征)和行为(动态特征),从而构建类。借助类的继承与多态机制,能够便捷地实现代码复用,显著缩短软件开发周期,并确保软件风格的一致性。因此,面向对象的编程语言使得程序能够较为准确地反映问题域的本质,软件开发人员可以运用人类惯用的思维模式进行开发工作。C++语言是目前应用最为广泛的面向对象编程语言。 1-3 结构化程序设计方法是什么?这种方法有哪些优势和不足? 解: 结构化程序设计的核心思想是自顶向下、逐步求精;其程序结构按照功能划分为多个基本模块;各模块之间的关联尽可能简化,在功能上保持相对独立性;每个模块内部均由顺序、选择和循环三种基本结构构成;模块化实现的具体途径是利用子程序。结构化程序设计由于采用模块分解与功能抽象,自顶向下、分而治之的策略,从而有效地将一个较为复杂的程序系统设计任务分解成许多易于管理和处理的子任务,便于开发与维护。 尽管结构化程序设计方法具备诸多优点,但它本质上仍是一种面向过程的程序设计方法,将数据与处理数据的操作分离为相互独立的实体。当数据结构发生变化时,所有相关的处理过程都需要进行相应的调整,每一种...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值