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/