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 };
原文地址:https://www.cnblogs.com/rogarlee/p/3425499.html