虽然我们这是非递归实现,但是我还是要讲一下递归序
递归序号就是每个节点我们实际是到达三次的
比如这题是先序就是:头左右
我们不管什么序,先来遍历吧
112333221先序是打第一次出现的时候所以是123
我们如何通过自己压栈实现呢
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> preorderTraversal(TreeNode head) {
List<Integer> list=new ArrayList<>();
if(head!=null)//头一直在变变成子树的头
Stack<TreeNode> stack=new Stack<TreeNode>();
stack.add(head);//栈里压入新头
while(!stack.isEmpty()){
head=stack.pop();//栈顶pop出来
// System.out.printf("%d\n",head.val);
list.add(head.val);
if(head.right!=null){
stack.push(head.right);//右孩子入栈
}
if(head.left!=null){
stack.push(head.left);//左孩子入栈
}
}
}
return list;
}
}
这样一来头节点都是进去就迅速被弹出,顺着进去又弹出的头,把他的右孩子压进去,再压它的左孩子,此时栈内有他的左右孩子栈不空所以,弹出它的左孩子,又把左孩子的右左孩子压进去
如图
①压栈,栈不空开始弹出①,把它右孩子②压进去,栈不空弹出②,把它左孩子压进去③最后弹出③
得123