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 };