在java中二叉树的遍历顺序

Posted 小牛儿帥

tags:

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

二叉树的遍历顺序

在这里插入图片描述
在这篇文章中二叉树的递归和非递归创建对二叉树由简单的介绍,在此基础上来仔细分析二叉树的遍历顺序。例子如下图:在这里插入图片描述

先序遍历

在这里插入图片描述

先序遍历的顺序应该是7,2,1,4,3,5,8,中、左、右的遍历方式。采用递归的遍历方式相对于非递归的遍历更容易理解一点,先序的递归思路是先访问的根节点,所以首先访问的是根节点7,紧接着到了2号结点也是7号结点的左节点,在去访问2号结点的左节点在右节点,先序主要遍历方式就是根节点 左节点 右节点的方式。
1.先序的递归遍历

public void perorder(Node root) {//先序遍历
	if(root!=null) {
		System.out.println(root.date);
		perorder(root.leftNode);
		perorder(root.rightNode);
	}
}

2.先序的非递归遍历

public void preOrder(Node root) {//前序非递归
	Stack<Node> stack = new Stack<Node>(); 
	Node node = root;
	while(node!=null||stack!=null) {
		if(node!=null) {
			stack.push(node);
			System.out.println(node.date);
			node=node.leftNode;
		}else if(stack!=null){
			node=stack.pop();
			node=node.rightNode;
		}
	}
}

中序遍历

在这里插入图片描述
中序遍历的顺序应该是1,2,3,4,5,7,8,左、中、右的遍历方式。中序的非递归遍历方式思路首先找到非递归的起点,二叉树的最左子树,如上图中的1号结点,在遍历的过程中需要用栈来存取左节点不为空的结点 方便遍历。
1.递归中序遍历

public void inorder(Node root) {//中序遍历
	if(root!=null) {
		inorder(root.leftNode);
		System.out.print(root.date+" ");
		inorder(root.rightNode);
	}
}

2.非递归中序遍历

public Node Gofarleft(Node n,Stack<Node> stack) {//用来查找最左子结点
	if(n==null) {
		return null;
	}
	while(n.leftNode!=null) {//如果左节点不为空,进入循环体
		stack.push(n);//将左节点不为空的结点入栈,先进后出,刚好满足 遍历顺序
		n=n.leftNode;//下一个左节点
	}
	
	return n;
}
public void inorderF(Node root) {//非递归中序遍历
	Stack<Node> stack = new Stack<Node>(); //初始化栈空间
	Node node = Gofarleft(root, stack);//判断二叉树的最左子树的左节点并返回
	while(node!=null) {//如果该节点不为空
		System.out.println(node.date);//答应该节点数据
		if(node.rightNode!=null) {//如果该节点存在右节点
			node=Gofarleft(node.rightNode, stack);//继续遍历寻找最左子树
		}else if(!stack.empty()) {//如果栈不为空时,将栈顶元素弹出,此时的结点没有左右子节点
			node = stack.pop();
		}else {//否则该节点为空,退出循环体
			node=null;
		}
	}
	
}

后序遍历

在这里插入图片描述
后序遍历的顺序应该是1,3,5,4,2,8,7,左、右、中的遍历方式。
1.后序递归遍历

public void afterorder(Node root) {//后序遍历
	if(root!=null) {
	afterorder(root.leftNode);
	afterorder(root.rightNode);
	System.out.println(root.date);
	}

}

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

直击算法:Dart 中二叉树的构建与遍历

Java中二叉树存储结构实现

JAVA数据结构与算法之顺序存储二叉树

Java复习--树

Java复习--树

算法与数据结构二叉树的顺序存储代码