• 每天1题算法题(7)- 把二叉搜索树转换为累加树(√)


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

     解答

    最简单,也是最笨的方法。先遍历二叉树把结果保存到集合。

    再遍历二叉树把每个值和集合中的值进行比较

    class Solution {
        public TreeNode convertBST(TreeNode root) {
            if(root == null) {
                return root;
            }
            List<Integer> valList = new ArrayList();
            Stack<TreeNode> stack = new Stack();
            stack.push(root);
            while(!stack.empty()) {
                TreeNode treeNode = stack.pop();
                valList.add(treeNode.val);
                if(treeNode.right != null) {
                    stack.push(treeNode.right);
                }
                if(treeNode.left != null) {
                    stack.push(treeNode.left);
                }
            }
    
            stack.push(root);
            while(stack.size() > 0) {
                TreeNode treeNode = stack.pop();
                int oriVal = treeNode.val;
                int sumVal = 0;
                for(int i=0; i<valList.size();i++) {
                    if(valList.get(i) > treeNode.val) {
                        sumVal = sumVal + valList.get(i);
                    }
                }
                treeNode.val = oriVal + sumVal;
                if(treeNode.right != null) {
                    stack.push(treeNode.right);
                }
                if(treeNode.left != null) {
                    stack.push(treeNode.left);
                }
            }
            return root;
        }
    }

     官方解答

    要解这道题,首先得知道什么是搜索树

    二叉搜索树是一棵空树,或者是具有下列性质的二叉树:

    若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;

    若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;

    它的左、右子树也分别为二叉搜索树。

    本题中要求我们将每个节点的值修改为原来的节点值加上所有大于它的节点值之和。这样我们只需要反序中序遍历该二叉搜索树,记录过程中的节点值之和,并不断更新当前遍历到的节点的节点值,即可得到题目要求的累加树。

    class Solution {
        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;
        }
    }
  • 相关阅读:
    JavaScript通过ID获取元素坐标
    JavaScript通过id获取不到元素是什么原因阿?
    ROS常用库(五)navigation之Tutorials
    ROS常用库(四)API学习之常用common_msgs(下)
    ROS常用库(三)API学习之常用common_msgs(上)
    C++编程学习(十二) STL
    ROS大型工程学习(四)一键安装所有缺失的依赖!!!
    这是一篇水文
    ROS大型工程学习(三) ROS常用命令行
    C++编程学习(十一) 指针和引用的区别
  • 原文地址:https://www.cnblogs.com/s648667069/p/13732396.html
Copyright © 2020-2023  润新知