给定一个 N 叉树,返回其节点值的前序遍历 。
N 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null
分隔(请参见示例)。
示例1
输入:root = [1,null,3,2,4,null,5,6] 输出:[1,3,5,6,2,4]
示例2:
输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:[1,2,3,6,7,11,14,4,8,12,5,9,13,10]
对于二叉树遍历问题我们用最简单,最暴力的方法就是递归,如果只是AC的话,递归完全可以,如果面试的话,面试官可能会让你写出非递归遍历,接下来会分别介绍这两种方法,
递归思路:对于二叉树来说,前序遍历就是先输出根节点,再输出左节点,再输出右节点,根据这个思路我们可以写出对于N叉树的前序遍历方法
1、先输出根节点
2、遍历根节点的孩子节点,
3、重复步骤1
public List<Integer> preorder(Node root) {
List<Integer> result = new ArrayList<>();
if(root == null) return result;
digui(root,result);
return result;
}
public void digui(Node root,List<Integer> result){
if(root == null) return;
result.add(root.val);
List<Node> list = root.children;
for(int i = 0;i<list.size();i++){
digui(list.get(i),result);
}
}
非递归:同样的先想哈二叉树非递归的思路,它需要结合栈来实现,我们都知道栈是先进后出的结构,而前序遍历的顺序是根节点,左孩子,右孩子,那么入栈顺序就是将根节点的左右孩子按右孩子、左孩子的顺序入栈,最后再出栈就是前序遍历的结果。根据这个思路我们可以写出对于N叉树前序遍历的非递归方法
首先将根节点入栈
1,判断栈是否为空,不为空就出栈
2、再将他的孩子节点从右节点到左节点入栈
3、重复1
public List<Integer> preorder(Node root) {
List<Integer> result = new ArrayList<Integer>();
Stack<Node> stack = new Stack<Node>();
if(root == null)
return result;
stack.push(root);
while(!stack.isEmpty())
{
Node node = stack.pop();
result.add (node.val);
//逆序
Collections.reverse(node.children);
for(Node tmp : node.children)
{
stack.add(tmp);
}
}
return result;
}