如题,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;}