给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。
简单难度。先后序遍历左子树,再后序遍历右子树,再访问根节点。
最简单的就是使用递归的方式。
public List<Integer> postorderTraversal( TreeNode root ){
List<Integer> result = new ArrayList<>();
postorder( root, result );
return result;
}
private void postorder( TreeNode node, List<Integer> result ){
if( node == null ){
return;
}
postorder( node.left, result );
postorder( node.right, result );
result.add( node.val );
}
另一种非递归的方式,这种方式最好也要掌握。因为一般出到这种简单题的时候,可能会让你用非递归的方法写。
整体看起来和前序遍历的代码差不多,但是这里我们返回的List是LinkedList,巧妙的借助栈结构进行结果的反转。
public List<Integer> postorderTraversal( TreeNode root ){
//存储最终数据
LinkedList<Integer> result = new LinkedList<>();
if( root == null ){
return result;
}
//使用LinkedList模拟栈结构
LinkedList<TreeNode> nodes = new LinkedList<>();
nodes.add( root );
while( !nodes.isEmpty() ){
root = nodes.removeFirst();
//让结果倒序存储
result.addFirst( root.val );
if( root.left != null ){
nodes.addFirst( root.left );
}
if( root.right != null ){
nodes.addFirst( root.right );
}
}
return result;
}