二叉树遍历-非递归方法
二叉树遍历-非递归方法
1. 使用迭代方法,不使用递归方法,实现一个二叉树的前序遍历
1) 算法思想:使用堆栈辅助
- 创建一个堆栈和一个链表分别用来存储中间变量和结果,并且将root结点入栈。
- 如果栈不为空,从栈顶出栈一个结点,记为结点n ,存入链表尾部,然后分别将结点 n 的右节点和左结点入栈(注意右先入,左后入);如果栈为空,结束循环。
- 循环步骤 2 ,直至栈为空为止。
2) 实现程序如下:
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
LinkedList<TreeNode> stack = new LinkedList<>();
LinkedList<Integer> output = new LinkedList<>();
if (root == null) {
return output;
}
stack.add(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pollLast();
output.add(node.val);
if (node.right != null) {
stack.add(node.right);
}
if (node.left != null) {
stack.add(node.left);
}
}
return output;
}
}
2. 使用迭代方法,不使用递归方法,实现一个二叉树的后序遍历
1) 算法思想:使用堆栈辅助
- 创建一个堆栈和一个链表分别用来存储中间变量和结果,并且将root结点入栈。
- 如果栈不为空,从栈顶出栈一个结点,记为结点n ,存入链表头部,然后分别将结点 n 的左节点和右结点入栈(注意左先入,右后入);如果栈为空,结束循环。
- 循环步骤 2 ,直至栈为空为止。
2) 实现程序如下:
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
LinkedList<TreeNode> stack = new LinkedList<>();
LinkedList<Integer> res = new LinkedList<>();
if(root == null){
return res;
}
stack.add(root);
while(!stack.isEmpty()){
//出栈
TreeNode n = stack.pollLast(); //后进先出
res.addFirst(n.val);//添加至头部
if(n.left != null){
stack.add(n.left);
}
if(n.right != null){
stack.add(n.right);
}
}
return res;
}
}