二叉树前中序非递归遍历

Posted 码农历险技

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树前中序非递归遍历相关的知识,希望对你有一定的参考价值。

  最近在复习算法和数据结构的东西,直接在LeeCode上刷点题,先从二叉树的三层遍历做起。

先说明一下前中后序遍历的定义:

前序:根节点->左子树->右子树;

中序:左子树->根节点->右子树;

后序:左子树->右子树->根节点;

由于前中后序遍历都涉及回溯的过程,本质上是深度优先遍历,深度优先遍历可以用栈和递归实现,本文讲的是非递归遍历,所以用栈实现,话不多说,直接上代码。

前序遍历:

 public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}

public List<Integer> preorderTraversal(TreeNode root) {
if(root==null) return new ArrayList<Integer>();
List<Integer> list=new ArrayList<>();
Stack<TreeNode> stack=new Stack<>(); //定义一个栈
stack.push(root);
while(stack.size()!=0){
TreeNode a=stack.pop();
list.add(a.val);
//先把右子树放入栈中
if(null!=root.right){
stack.push(a.right);
}
//再把左子树放入栈中
if(null!=root.left){
stack.push(a.left);
}
}
return list;
}

LeeCode运行结果:

中序遍历:

class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list=new ArrayList<>();
Stack<TreeNode> stack=new Stack<>();
if(root==null) return list;
//先把左子树一层一层放进去
while(null!=root || !stack.isEmpty()){
if(null!=root){
stack.push(root);
root=root.left;
}else{
root=stack.pop();
list.add(root.val);
root=root.right;
}
}
return list;
}
}

LeeCode运行结果:

二叉树前中序非递归遍历


后序遍历:


这后序遍历难度居然是困难级别的,先思考一下,这后序遍历不就是先序遍历反过来,我们在做先序遍历的时候是把节点一个个放在ArrayList的尾部,现在反过来把节点一个个放在头部不就可以了,选用链表作为数据结构。

public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list=new LinkedList<>();
Stack<TreeNode> stack=new Stack<>();
if(root==null) return list;
stack.push(root);
while(stack.size()>0){
TreeNode a=stack.pop();
// list.addFirst(a.val);
//放在头部
((LinkedList<Integer>) list).addFirst(a.val);
if(null!=a.left){
stack.push(a.left);
}
if(null!=a.right){
stack.push(a.right);
}
}
return list;
}

LeeCode运行结果:





以上是关于二叉树前中序非递归遍历的主要内容,如果未能解决你的问题,请参考以下文章

二叉树的前中后序非递归法

二叉树的前中后序非递归法

二叉树前中后序遍历的实现(递归和非递归版)

力扣刷题二叉树前中后序遍历

leetcode算法总结 —— 二叉树前中后序遍历(迭代和递归两种解法)

已知二叉树前中序遍历,求后序 / 已知二叉树中后序遍历,求前序