todo:实现Morris遍历

image.png

思路1:栈式DFS

  • 维护两个结构sequence_preorderstack_nodes在弹栈的时候插入序列
  • 后入栈的先弹栈,那么后入栈的先插入序列,所以左边的后入栈,右边的先入栈。
  • 需要脑子里面有入栈弹栈的整个流程。结合代码适当记忆。

代码1:

  1. /*
  2. // Definition for a Node.
  3. class Node {
  4. public:
  5. int val;
  6. vector<Node*> children;
  7. Node() {}
  8. Node(int _val) {
  9. val = _val;
  10. }
  11. Node(int _val, vector<Node*> _children) {
  12. val = _val;
  13. children = _children;
  14. }
  15. };
  16. */
  17. class Solution {
  18. public:
  19. vector<int> preorder(Node* root) {
  20. stack<Node*> stack_nodes;
  21. vector<int> sequence_preorder;
  22. if (root == nullptr) {
  23. return sequence_preorder;
  24. }
  25. stack_nodes.push(root);
  26. while (!stack_nodes.empty()) {
  27. Node* node_cur = stack_nodes.top();
  28. stack_nodes.pop();
  29. sequence_preorder.push_back(node_cur->val);
  30. for (int i = node_cur->children.size() - 1; i >= 0; --i) {
  31. stack_nodes.push(node_cur->children[i]);
  32. }
  33. }
  34. return sequence_preorder;
  35. }
  36. };