说明
先理解前序 中序 后序的概念再来看
代码
/***
* 二叉树对象
* @author test
*
*/
public class Node {
public Object data;// 节点数据
public Node right; //右孩子
public Node left; //左孩子
//构造器
public Node(Object data,Node right,Node left){
this.data=data;
this.right=right;
this.left=left;
}
//初始化树 这个是从别人的代码直接复制过来的
public static Node init(){
Node x=new Node("X",null,null);
Node y=new Node("Y",null,null);
Node d=new Node("d",x,y);
Node e=new Node("e",null,null);
Node f=new Node("f",null,null);
Node c=new Node("c",e,f);
Node b=new Node("b",d,null);
Node a=new Node("a",b,c);
return a;
}
//前序递归方式遍历
/*****
* 逻辑理解
* 前序遍历:先左孩子-父节点-右孩子
* 首先判断该节点是否为空 不为空往下走
* 判断是否有左孩子,有则进行递归
* 若没有,则输出该节点数据
* (为什么在这个位置进行输出呢,因为在这个位置总的可分为两种情况:1、该节点为左孩子节点 2、该节点为父节点,并且只有右孩子)
* 然后再判断右孩子是否为空, 不为空递归
*
* 后面的中序和后序 逻辑一样
*
* @author test
* @param node
*/
public void pre(Node node){
if(node != null){
if(node.left != null){
pre(node.left);
}
System.out.println(node.data);
if(node.right != null){
pre(node.right);
}
}
}
//中序递归方式遍历
public void in(Node node){
if(node != null){
System.out.println(node.data);
if(node.left != null){
in(node.left);
}
if(node.right != null){
in(node.right);
}
}
}
//后序递归方式遍历
public void affter(Node node){
if(node != null){
if(node.right != null){
affter(node.right);
}
System.out.println(node.data);
if(node.left != null){
affter(node.left);
}
}
}
//前序遍历 非递归方式
/****
*
* @author test
* @param node
*/
public void preNoDigui(Node node){
Stack<Node> stack = new Stack<Node>(); //存放节点的栈
while(node != null || !stack.isEmpty()){//这里的判断需要小心,只有node以及stack均为空的时候才结束 这个需要将整个过程都捋一下才行
while( node != null){
stack.push(node);
node = node.left;
}
if(!stack.isEmpty()){
Node stackNode = stack.pop();//获取栈中已存下的节点
System.out.println(stackNode.data); // 获取节点数据
node = stackNode.right; //遍历右孩子
}
}
}
public static void main(String[] args) throws JsonProcessingException {
//初始化
Node node = Node.init();
//这个使用的是spring mvc 的json工具,需要自行导入 依赖
ObjectMapper oMapper= new ObjectMapper();
//这里将node装换成json字符串 然后将打印出来的数据拿到 json格式化网站,可以很清晰的看出该结构
// System.out.println(oMapper.writeValueAsString(node));
//前序
// node.pre(node);
//中序
// node.in(node);
//后序
// node.affter(node);
}
}
树的数据结构
{
"data":"a",
"right":{
"data":"b",
"right":{
"data":"d",
"right":{
"data":"X",
"right":null,
"left":null
},
"left":{
"data":"Y",
"right":null,
"left":null
}
},
"left":null
},
"left":{
"data":"c",
"right":{
"data":"e",
"right":null,
"left":null
},
"left":{
"data":"f",
"right":null,
"left":null
}
}
}