zoukankan      html  css  js  c++  java
  • 每天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;
        }
    }
  • 相关阅读:
    HTML DOM教程 9HTML DOM Window 对象
    HTML DOM教程 11HTML DOM Screen 对象
    Android项目中把bin文件夹里面的.apk文件删除,怎么让它再生成
    Qt把ping www.baidu.com之后的内容的内容输出到一个名为output的文档
    Qt之QProcess 和 c语言对比
    Git的Windows版本Msysgit的中文乱码解决
    多系统 grub之ubuntu的 grub
    QT中调用外部程序:QProcess的使用
    repo的小结
    恢复Ubuntu默认的面板
  • 原文地址:https://www.cnblogs.com/s648667069/p/13732396.html
Copyright © 2011-2022 走看看