zoukankan      html  css  js  c++  java
  • LIntcode---将二叉搜索树转成较大的树

    Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original BST is changed to the original key plus sum of all keys greater than the original key in BST.

    样例

    Given a binary search Tree `{5,2,3}`:

                  5
                /   
               2     13
    

    Return the root of new tree

                 18
                /   
              20     13


    思路:

     看清楚题目,题目给的条件是一颗二叉搜索树!!!
     
     这道题让我们将二叉搜索树转为较大树,通过题目汇总的例子可以明白,是把每个结点值加上所有比它大的结点值总和
     当作新的结点值。
     
     仔细观察题目中的例子可以发现,2变成了20,而20是所有结点之和,因为2是最小结点值,要加上其他
     所有结点值,所以肯定就是所有结点值之和。5变成了18,是通过20减去2得来的,而13还是13,是由20
     减去7得来的,而7是2和5之和。我开始想的方法是先求出所有结点值之和,然后开始中序遍历数组,同
     时用变量sum来记录累加和,根据上面分析的规律来更新所有的数组。
     
     但是通过看论坛,发现还有更巧妙的方法,不用先求出的所有的结点值之和,而是巧妙的将中序遍历左根右的顺序逆过来,
     变成右根左的顺序,这样就可以反向计算累加和sum,同时更新结点值,参见代码如下
     

    class Solution {
    public:
        /**
         * @param root the root of binary tree
         * @return the new root
         */
        
         
        TreeNode* convertBST(TreeNode* root) {
            // Write your code here
            int sum = 0;
            help(root, sum);
            return root;
        }
        
        
        void help(TreeNode*& node, int& sum) {
            
            if (node==NULL){
                return;
            }
            
            help(node->right, sum);
            node->val += sum;
            sum = node->val;
            help(node->left, sum);
        }
    };
    

    另一种迭代方法:

    /*
    class Solution {
    public:
        TreeNode* convertBST(TreeNode* root) {
            if (!root) return NULL;
            int sum = 0;
            stack<TreeNode*> st;
            TreeNode *p = root;
            while (p || !st.empty()) {
                while (p) {
                    st.push(p);
                    p = p->right;
                }
                p = st.top(); st.pop();
                p->val += sum;
                sum = p->val;
                p = p->left;
            }
            return root;
        }
    };
    
    */
    
  • 相关阅读:
    实参和形参
    location对象
    区别 apply,call
    窗体之间的交互(window.opener)
    我的升级脚本总结
    Create elements
    history 对象
    函数参数的属性:callee
    发布app store流程
    【转】如何生成静态页面的五种方案
  • 原文地址:https://www.cnblogs.com/Allen-rg/p/7063276.html
Copyright © 2011-2022 走看看