当前位置: 代码迷 >> 综合 >> 迭代法搞定N叉树的前序遍历和后序遍历
  详细解决方案

迭代法搞定N叉树的前序遍历和后序遍历

热度:9   发布时间:2024-02-06 16:43:57.0

如题,N叉树的前序遍历和后续遍历。leetcode上两道题挨着,让用迭代法。我先给一下递归的代码:

前序:

/*
// Definition for a Node.
class Node {public int val;public List<Node> children;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, List<Node> _children) {val = _val;children = _children;}
};
*/class Solution {List<Integer> l=new ArrayList<>();public List<Integer> preorder(Node root) {if(root==null){return l;}l.add(root.val);if(root.children!=null){for(Node n:root.children){preorder(n);}}return l;}
}

后续:

class Solution {public List<Integer> postorder(Node root) {post(root);return l;}LinkedList<Integer> l=new LinkedList<>();public void post(Node root){if(root!=null){if(root.children!=null){for(Node i:root.children){post(i);}}l.add(root.val);}}
}

递归的时候注意空指针异常!

前序迭代:

class Solution {public List<Integer> preorder(Node root) {LinkedList<Node> stack=new LinkedList<>();LinkedList<Integer> l=new LinkedList<>();if(root==null){return l;}stack.add(root);while(!stack.isEmpty()){Node n=stack.pollLast();l.add(n.val);Collections.reverse(n.children);for(Node n1:n.children){stack.add(n1);}}return l;}
}

前序迭代是先根后孩子,迭代过程中先把当前节点加入,然后把孩子节点反转入栈,这样出栈顺序就是按照“顺序”的。

后序迭代的不同在于先孩子后根,也是利用栈,但是用的是addFirst,“逆序装载”!注意!感觉挺不好理解的!需要模拟一下。

后续迭代:

class Solution {public List<Integer> postorder(Node root) {LinkedList<Node> stack=new LinkedList<>();LinkedList<Integer> l=new LinkedList<>();if(root==null){return l;}//l.add(root.val);stack.add(root);while(!stack.isEmpty()){Node n=stack.pollLast();l.addFirst(n.val);for(Node i:n.children){stack.add(i);}}return l;}

 

  相关解决方案