LeetCode 之 Binary Tree Preorder Traversal(树)

水深无声 2022-08-02 14:46 197阅读 0赞

【问题描述】

Given a binary tree, return the preorder traversal of its nodes’ values.For example:

Given binary tree {1,#,2,3},

  1. 1
  2. \
  3. 2
  4. /
  5. 3

return [1,2,3] .

Note: Recursive solution is trivial, could you do it iteratively?

1.【基础知识】

递归和迭代的区别?

递归及函数调用本身;迭代即循环,循环体中存在自变。

详见:C++ 迭代与递归 浅析

详址:http://blog.csdn.net/u013630349/article/details/47036459

2.【屌丝源码】

  1. class Solution {
  2. public:
  3. int longestValidParentheses(string s) {
  4. int start = s.find('(');
  5. // 没有正括号
  6. if(start<0)
  7. return 0;
  8. // 如果字符串只有一个元素
  9. string mystr = s.substr(start,s.size()-start);
  10. if(s.size()<=1)
  11. return 0;
  12. stack<char> mystack;
  13. int i(0),max(0),count(0),j(0);
  14. while(i<=mystr.rfind('('))
  15. {
  16. int a[100];
  17. for(j=0;j<mystr.size(),j++)
  18. }
  19. }
  20. };
  • 实现失败!

  • 一直在思考递归是怎么做得,如何模仿,因此,出现如下问题和对策。

1.如何保存变量——静态变量;

2.如何实现静态变量的赋值——类外;

3.到底是给注释中数据结构的二叉树还是给题目中数组——按数据结构来。

  • 卡壳的地方:

如果树为空,如果到达叶子,返回什么?

迭代实现,问题在于,终止条件和层次中的迭代处理方式?

3.【AC源码】

  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. vector<int> preorderTraversal(TreeNode *root) {
  13. vector<int> result;
  14. const TreeNode *p;
  15. stack<const TreeNode *> s;
  16. p = root;
  17. if (p != nullptr) s.push(p);
  18. while (!s.empty()) {
  19. p = s.top();
  20. s.pop();
  21. result.push_back(p->val);
  22. if (p->right != nullptr) s.push(p->right);
  23. if (p->left != nullptr) s.push(p->left);
  24. }
  25. return result;
  26. }
  27. };

4.【复盘】

1)不去调试谈什么实现?

不管能不能实现,基本的框架先要给出来,给自己一个可以调试的框架,不盲目写代码不等于代码不写,代码肯定要写,只是说不能实现的时候盲目冒进!

2)简单问题复杂化是思想上的不开动和知识上的不熟悉!

一般问题先考虑不用数据结构行不行,不行的话用数据结构用什么结构合理,像树这种东西就是往下走,不会把结构往复杂的图之流了去,队列、栈、线性表轮着过一遍,答案就出来了。

5.【算法核心思想】

1)初始化Vector,树空直接返回,不为空进入压栈弹栈机制;

2)(按从根出发先遍历左子树再遍历右子树的遍历思想),依次循环从根出发,先右子树先入栈左子树后入栈(子树弹栈是和压栈顺序反过来的);

3)栈空停止迭代。

发表评论

表情:
评论列表 (有 0 条评论,197人围观)

还没有评论,来说两句吧...

相关阅读