递归与非递归遍历二叉树(各三种)
2017-11-01 19:29
302 查看
递归方法遍历
首先创建树的节点类public class MyNode { private String value; private MyNode left; private MyNode reight; public MyNode(String value, MyNode left, MyNode reight) { this.value = value; this.left = left; this.reight = reight; } /** * 访问当前节点 */ public void visit() {System.out.println(value);} public MyNode getLeft() { return left; } public MyNode getReight() { return reight; } }
我们构造的二叉树结构如下:
/** * 测试用的二叉树 */ | A | | B C | | | | D E F G | | | H I J
先序遍历二叉树
public class PreVisitImpl implements VisitAll { /** * 先序遍历二叉树 * 先访问中间节点,再访问左节点,再访问右节点 */ public void visitTree(MyNode node) { if(node ==null) { return ; } node.visit(); visitTree(node.getLeft()); visitTree(node.getReight()); } }
A B D E H I C F G J
中序遍历二叉树
/** * 中序遍历二叉树 * 先访问左节点,再访问中间节点,再访问右节点 */ public void visitTree(MyNode node) { if(node ==null) { return ; } visitTree(node.getLeft()); node.visit(); visitTree(node.getReight()); }
D B H E I A F C J G
后序遍历二叉树
/** * 后序遍历二叉树 * 先访问左节点,再访问右节点,再访问中间节点 */ public void visitTree(MyNode node) { if(node ==null) { return ; } visitTree(node.getLeft()); visitTree(node.getReight()); node.visit(); }
D H I E B F J G C A
非递归方法遍历
由于树的这种数据结构,无法通过自身的结构找到当前节点的父节点,所以,对于非递归方式遍历二叉树,采取的是,创建一个栈用于存放经过的节点,节点入栈,利用回溯的思想,当访问或者遍历到叶子节点的时候,将叶子节点出栈,返回到当前叶子节点的父节点。先序遍历二叉树
public void visitTree(MyNode node) { Deque<MyNode> deque = new ArrayDeque<MyNode>(); while(node != null || deque.size() > 0) { while(node != null) { deque.push(node); node.visit(); node =node.getLeft(); } if(deque.size() >0) { node = deque.pop(); node =node.getReight(); } } }
中序遍历二叉树
public void visitTree(MyNode node) { Deque<MyNode> deque = new ArrayDeque<MyNode>(); while(node != null || deque.size() > 0) { while(node != null) { deque.push(node); node =node.getLeft(); } if(deque.size() >0) { node = deque.pop(); node.visit(); node =node.getReight(); } } }
后序遍历二叉树
public void visitTree(MyNode node) { Deque<MyNode> deque = new ArrayDeque<MyNode>(); MyNode preVisit =null; while(node != null || deque.size() > 0) { while(node != null) { deque.push(node); preVisit=node; node =node.getLeft(); } //当前节点的右孩子如果为空或者已经被访问,则访问当前节点 if(deque.size() >0) { node =deque.getFirst(); if(node.getReight()==null ||node.getReight()==preVisit) { node.visit(); preVisit =node ; deque.pop(); node = null; }else { node=node.getReight(); } } } }
相关文章推荐
- 二叉树的三种遍历,包括递归与非递归,c++语言
- 二叉树的三种遍历方法(递归和非递归)
- 二叉树的三种遍历的递归和非递归的总结(详细,有推导)java
- 二叉树的三种遍历方法(递归和非递归)(转载)
- 二叉树的三种遍历方式(递归与非递归详细实现)
- 二叉树的存储方式以及递归和非递归的三种遍历方式
- 43 递归和非递归俩种方法实现二叉树的三种遍历
- 二叉树的三种遍历方式的递归实现和非递归实现
- 二叉树的三种遍历的方法(递归和非递归完整版)
- 二叉树的存储方式以及递归和非递归的三种遍历方式
- 二叉树的三种遍历方法(递归和非递归)
- 【python中二叉树的实现】python中二叉树的创建、三种方式递归遍历和非递归遍历
- 二叉树的三种遍历方式(递归和非递归的实现方法)
- 二叉树的三种遍历,递归与非递归
- 二叉树的三种遍历方式(递归和非递归)
- 二叉树的三种遍历方法(递归和非递归)(转载)
- 二叉树的存储方式以及递归和非递归的三种遍历方式
- 二叉树的存储方式以及递归和非递归的三种遍历方式
- 二叉树的三种遍历方法(递归和非递归)(转载)
- 二叉树的存储方式以及递归和非递归的三种遍历方式