思路:
1.递归,左 右 根 ,最后加节点数据
2.栈, 能不能用一个栈 来将数据成 根 右 左 这样添加进去,然后取出来就是我们想要的左 右 根了
当然有,先由一个栈不断添加左 右节点,然后栈顶是右节点,再遍历这个右节点,每次添加 它的左右 节点。同时在循环的时候不断用新栈添加当前节点。看代码取画个图吧,画个不被定义的图,很容易理解。
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return int整型一维数组
*/
public int[] postorderTraversal (TreeNode root) {
// write code here
if (root == null ) {
return new int[] {};
}
//左右根
ArrayList<Integer> result = new ArrayList<>();
inOrderBFS(root, result);
return result.stream().mapToInt(Integer::intValue).toArray();
}
private void inOrder(TreeNode node, ArrayList<Integer> result) {
if (node == null) {
return;
}
inOrder(node.left, result);
inOrder(node.right, result);
result.add(node.val);
}
private void inOrderBFS(TreeNode node, ArrayList<Integer> result) {
if (node == null) {
return;
}
Stack<TreeNode> s1 = new Stack<>();
Stack<TreeNode> s2 = new Stack<>();
s1.push(node);
TreeNode currentNode = null;
while (!s1.empty()) {
currentNode = s1.pop();
s2.push(currentNode);
if(currentNode.left != null){
s1.push(currentNode.left);
}
if(currentNode.right != null){
s1.push(currentNode.right);
}
}
while(!s2.empty()){
result.add(s2.pop().val);
}
}
}