zoukankan      html  css  js  c++  java
  • 538. 把二叉搜索树转换为累加树

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

    例如:

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

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

    思路:二叉树的中序遍历结果就是从小到大的顺序输出,那么右中左则是从大到小的结果输出了,很明显从大到小记录下当前的值加到后一个元素即可。这里采用递归的方法遍历整棵树。

    Solution:

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     TreeNode* convertBST(TreeNode* root) 
    13     {
    14         sum = 0;
    15         return reversePostOrder(root);
    16     }
    17     TreeNode* reversePostOrder(TreeNode* root)
    18     {
    19         if(root!=nullptr)
    20         {
    21             reversePostOrder(root->right);
    22             root->val+=sum;
    23             sum = root->val;
    24             reversePostOrder(root->left);
    25         }
    26         return root;
    27     }
    28 
    29 private:
    30     int sum; 
    31 };

    反思:真是汗颜,我对二叉树的理解真是差。中序就是从小到大的顺序输出我居然完全想不起来!再试试用迭代的方法来做这题。

    solution2:

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12   TreeNode* convertBST(TreeNode* root)
    13   {
    14     sum = 0;
    15     return de_inOrder(root);
    16   }
    17 private:
    18   TreeNode* de_inOrder(TreeNode* root)
    19   {
    20     stack<TreeNode*>st;
    21     TreeNode* p = root;
    22     while (p != nullptr || !st.empty())
    23     {
    24       while (p != nullptr)
    25       {
    26         st.push(p);
    27         p = p->right;
    28       }
    29       if (!st.empty())
    30       {
    31         p = st.top();
    32         p->val += sum;
    33         sum = p->val;
    34         st.pop();
    35         p = p->left;
    36       }
    37     }
    38     return root;
    39   }
    40 private:
    41   int sum;
    42 };

    反思:二叉树的中序遍历迭代版本,和之前的版本没区别。

  • 相关阅读:
    Lucene in action 笔记 case study
    关于Restful Web Service的一些理解
    Lucene in action 笔记 analysis篇
    Lucene in action 笔记 index篇
    Lucene in action 笔记 term vector
    Lucene in action 笔记 search篇
    博客园开博记录
    数论(算法概述)
    DIV, IFRAME, Select, Span标签入门
    记一个较困难的SharePoint性能问题的分析和解决
  • 原文地址:https://www.cnblogs.com/Swetchine/p/11255951.html
Copyright © 2011-2022 走看看