原题网址:http://www.lintcode.com/zh-cn/problem/binary-tree-preorder-traversal/
给出一棵二叉树,返回其节点值的前序遍历。
您在真实的面试中是否遇到过这个题?
Yes
样例
给出一棵二叉树 {1,#,2,3}
,
1
\
2
/
3
返回 [1,2,3]
.
挑战
你能使用非递归实现么?
标签
方法一:递归……依旧是在函数外定义类成员作为函数返回值。
1 /** 2 * Definition of TreeNode: 3 * class TreeNode { 4 * public: 5 * int val; 6 * TreeNode *left, *right; 7 * TreeNode(int val) { 8 * this->val = val; 9 * this->left = this->right = NULL; 10 * } 11 * } 12 */ 13 14 class Solution { 15 public: 16 /** 17 * @param root: A Tree 18 * @return: Preorder in ArrayList which contains node values. 19 */ 20 vector<int> result; 21 vector<int> preorderTraversal(TreeNode * root) { 22 // write your code here 23 if (root!=NULL) 24 { 25 result.push_back(root->val); 26 preorderTraversal(root->left); 27 preorderTraversal(root->right); 28 } 29 return result; 30 } 31 };
方法二:非递归,让我吐血一会……
参考:https://blog.csdn.net/hk_john/article/details/69424907
https://blog.csdn.net/chan15/article/details/48831813
简单说几句,前序遍历即根左右,非递归的话使用移动指针指向根节点,先判断根节点是否为NULL,不为NULL就将val值push到结果数组中;
然后是左,左可能是子树,遍历子树依旧遵循根左右原则,所以要用循环的方式将左节点赋值给移动指针;
再然后是右,我靠右怎么办啊,移动指针已经指向左了!淡定,这时候可以使用额外空间存储右的根节点或者右节点本身,这个额外空间是stack或是vector就任君挑选了,反正利用的都是栈结构先进后出的思想。当遍历左节点直至叶子结点并且这个额外空间不为空时,取出右节点赋值给移动指针继续遍历。
代码:
刚开始没有加else break;导致死循环,面壁……每次碰到while循环且条件判断中的量在循环体中不断变化时就容易死循环,咋不长记性呢
1 /** 2 * Definition of TreeNode: 3 * class TreeNode { 4 * public: 5 * int val; 6 * TreeNode *left, *right; 7 * TreeNode(int val) { 8 * this->val = val; 9 * this->left = this->right = NULL; 10 * } 11 * } 12 */ 13 14 class Solution { 15 public: 16 /** 17 * @param root: A Tree 18 * @return: Preorder in ArrayList which contains node values. 19 */ 20 vector<int> preorderTraversal(TreeNode * root) { 21 // write your code here 22 vector<int> result; 23 TreeNode *p=root; 24 stack<TreeNode *> s; 25 26 while (p!=NULL) //while (p!=NULL)循环结束,p是否可能为NULL?; 27 { //如果不为NULL,如何结束循环?; 28 result.push_back(p->val); 29 if (p->right!=NULL) 30 { 31 s.push(p); 32 } 33 if (p->left!=NULL) 34 { 35 p=p->left; 36 } 37 else if (s.empty()!=true) 38 { 39 p=s.top()->right; //p=s.top()取的是根节点; 40 s.pop(); 41 } 42 else 43 { 44 break; 45 } 46 } 47 return result; 48 } 49 };