leetcode算法题 pro538-累加树

LeetCode pro538

leetcode的一道简单算法题,是关于累加树的,要求把二叉搜索树转换为累加树

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

例如:

输入: 原始二叉搜索树:
5
/
2 13

输出: 转换为累加树:
18
/
20 13

关于二叉搜索树
二叉搜索树一般使用链表结构为底层结构,其中每一个结点就是一个对象。每个结点除了存的值之外,还包含属性lchild、rchild和parent,分别指向结点的左孩子、右孩子和双亲(父结点)。如果某个孩子结点或父结点不存在,则相应属性的值为空。二叉搜索树的性质:设x是二叉搜索树中的一个结点。如果y是x左子树中的一个结点,那么y.key≤x.key。如果y是x右子树中的一个结点,那么y.key≥x.key。
在二叉搜索树中:
1.若任意结点的左子树不空,则左子树上所有结点的值均不大于它的根结点的值。
2. 若任意结点的右子树不空,则右子树上所有结点的值均不小于它的根结点的值。
3.任意结点的左、右子树也分别为二叉搜索树。

刚开始做这题,想复杂了,后来看了别人的评论之后,明白了用中序反序序列遍历累加可以很容易做出来。

就是按照右节点根节点左节点的顺序来累加,举个例子,相当于一个有序数组[1,2,3]从右边开始累加,变成[6,5,3]

实现代码:

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }

}

class Solution {

    public int sum = 0;
    public TreeNode convertBST(TreeNode root) {
          if(root != null){
              convertBST(root.right);//优先遍历右节点字数,将其累加
              sum += root.val;//其次遍历根节点
              root.val = sum;
              convertBST(root.left);//最后累加左节点
          }
          return root;
    }
}

输出结果:

题目转载于leetcode,地址:https://leetcode-cn.com/problems/convert-bst-to-greater-tree/

posted @ 2020-09-21 18:07  TidalCoast  阅读(253)  评论(0编辑  收藏  举报