03-二叉树的遍历

二叉树的遍历

定义:

遍历是数据结构中的常见操作把所有元素都访问一遍

线性数据结构的遍历比较简单分为:正序遍历和逆序遍历

根据结点访问顺序的不同,二叉树的常见遍历方式有4种

前序遍历(Preorder Traversal)
中序遍历(inorder Traversal)
后序遍历(Postorder Traversal)
层序遍历(Level Order Traversal)

前序遍历

  • 访问顺序
    • 根结点、前序遍历子树、前序遍历子树
    • 7、4、2、1、3、5、9、8、11、10、12
      类似递归
	/**
	 * 前序遍历
	 */
@SuppressWarnings("unused")
// 公开的方法
public void preorderTravesal() {
	preorderTravesal(rootNode);
}
// 私有的方法
private void preorderTravesal(Node<E> node) {
	if(node == null) return;
	System.out.println(node.element);
	preorderTravesal(node.liftnode);
	preorderTravesal(node.rightnode);
}
	public static void main(String[] args) {
		BinarySearchTree <Integer> bst3 = new BinarySearchTree<>();
		Integer data[] = new Integer[] {
				7,4,2,1,3,5,9,8,11,10,12
		};
		for(int i = 0 ; i < data.length; i++) {
			bst3.add(data[i]);
		}
		bst3.preorderTravesal();

中序遍历

  • 访问顺序
    • 中序遍历左子树、根结点、中序遍历右子树
      • 1、2、3、4、5、7、8、9、10、11、12
    • 如果访问顺序是下面这样呢?
      • 中序遍历右子树、根结点、中序遍历左子树
      • 12、11、10、9、8、7、5、4、3、2、1
    • 二叉搜索树中序遍历的结果是升序或降序的
	/**
	 * 中序遍历
	 */
	@SuppressWarnings("unused")
	// 公开的方法
	public void inorderTravesal() {
		inorderTravesal(rootNode);
	}
	// 私有的方法
	private void inorderTravesal(Node<E> node) {
		if(node == null) return;
		inorderTravesal(node.liftnode);
		System.out.println(node.element);
		inorderTravesal(node.rightnode);
	}

后序遍历

  • 访问顺序
    • 后序遍历左子树、后序遍历右子树、根结点
      • 1、3、2、5、4、8、10、12、11、9、7
	/**
	 * 后序遍历
	 */
	@SuppressWarnings("unused")
	// 公开的方法
	public void psotorderTravesal() {
		psotorderTravesal(rootNode);
	}
	// 私有的方法
	private void psotorderTravesal(Node<E> node) {
		if(node == null) return;
		// 先左再右后自身
		psotorderTravesal(node.liftnode);
		psotorderTravesal(node.rightnode);
		System.out.println(node.element);//自身 
	}

后序遍历

  • 访问顺序
    • 从上到下、从左到右依次访问每一个结点
    • 7、4、9、2、5、8、11、1、3、10、12
  • 实现思路:使用队列(先入先出)
    1.将根结点入队
    2.循环执行以下操作,直到队列为空
    • 将队头结点A出队,进行访问
    • 将A的左子节点入队
    • 将A的右子节点入队
posted @   回眸晓三生  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示