• Binary Tree Preorder Traversal @leetcode


    http://oj.leetcode.com/problems/binary-tree-preorder-traversal/

    !看题上来就递归

     1 /**
     2  * Definition for binary tree
     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     vector<int> preorderTraversal(TreeNode *root) {
    13         // IMPORTANT: Please reset any member data you declared, as
    14         // the same Solution instance will be reused for each test case.
    15         vector<int> res;
    16         preorderTraversalSmall(root,res);
    17         return res;
    18     }
    19 
    20     void preorderTraversalSmall(TreeNode *root,vector<int> &res) {
    21         // IMPORTANT: Please reset any member data you declared, as
    22         // the same Solution instance will be reused for each test case.
    23         if(root == NULL)
    24         {
    25             return ;
    26         }
    27         res.push_back(root->val);
    28         preorderTraversalSmall(root->left,res);
    29         preorderTraversalSmall(root->right,res);
    30     }
    31 };

    #然后仔细推敲了题目中这句话:Note: Recursive solution is trivial, could you do it iteratively?

    我之前的世界观是:Recursive的意思是循环或者递归,iterative的意思是迭代。我一下就蒙圈了,既然我认为Recursive又是循环又是递归,那计算机界总不能两个思想用一个词吧?而天天挂在嘴上的迭代又TM在这里表示什么?查了一下有道,recursive的确表示循环和递归,但是有个[数]的标记。然后维基:

    recursion -- http://en.wikipedia.org/wiki/Recursion

    iteration -- http://en.wikipedia.org/wiki/Iteration

    在计算机科学中,迭代是程序中对一组指令(或一定步骤)的重复。它既可以被用作通用的术语(与“重复”同义),也可以用来描述一种特定形式的具有可变状态的重复。
    递归(英语:Recursion),又译为递回,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。

    虽然“一组指令的重复”,这句话区分不开递归和循环,但是我知道了recursion一词,在计算机领域,就翻译成“递归”。我人生观的bug,再一次得到了修复。

    !在明白的题意后(虽然已经AC了&&采用了本题不推荐的方式),开始考虑如何用迭代的方式来做。想到栈这个神奇的东西,就迎刃而解了。

     1 /**
     2  * Definition for binary tree
     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     vector<int> preorderTraversal(TreeNode *root) {
    13         // IMPORTANT: Please reset any member data you declared, as
    14         // the same Solution instance will be reused for each test case.
    15         vector<int> res;
    16         stack<TreeNode*> tmp;
    17         TreeNode*top = root;
    18         while(top)
    19         {
    20             res.push_back(top->val);
    21             if(top->right)
    22                 tmp.push(top->right);
    23             if(top->left)
    24             {
    25                 top = top->left;
    26             }
    27             else if(tmp.size()>0)
    28             {
    29                 top = tmp.top();
    30                 tmp.pop();
    31             }
    32             else
    33             {
    34                 break;
    35             }
    36         }
    37         return res;
    38     }
    39 };
  • 相关阅读:
    Tinkoff Challenge
    Tinkoff Challenge
    Tinkoff Challenge
    Tinkoff Challenge
    整体二分
    树链剖分+LCT
    上下界网络流
    莫队
    可并堆
    bzoj_1033: [ZJOI2008]杀蚂蚁antbuster
  • 原文地址:https://www.cnblogs.com/rogarlee/p/3425499.html
Copyright © 2020-2023  润新知