二叉树的遍历及其Java实现

所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问,对二叉树的遍历就是将非线性结构的二叉树中的节点排列在一个线性序列上的过程。访问结点所做的操作依赖于具体的应用问题。

遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。

如果采用顺序结构来保存二叉树,遍历二叉树非常容易,直接遍历底层数组即可。如果采用链表来保存,则有以下两类遍历方式:

  • 深度优先遍历:先访问树中最深层次的节点
  • 广度优先遍历:逐层访问每层节点,先访问根节点,然后访问第二层的节点。。。以此类推。因此广度优先遍历又称为按层遍历。

对于深度优先遍历算法,可以分为以下3种:

  • DLR:前序遍历(PreorderTraversal亦称(先序遍历))
  • LDR:中序遍历(InorderTraversal)
  • LRD:后序遍历(PostorderTraversal)

深度遍历的先序遍历、中序遍历、后序遍历这三种遍历方式都是针对根节点(D)而言的。先处理根节点的就是先序遍历,其次处理根节点的就是中序遍历,最后处理根节点的就是后序遍历。

三种递归遍历算法的搜索路线相同(如下图虚线所示)。

具体线路为:

从根结点出发,逆时针沿着二叉树外缘移动,对每个结点均途径三次,最后回到根结点。

1、先序遍历

(1)访问根节点

(2)递归遍历左子树

(3)递归遍历右子树

Java实现代码:

//实现先序遍历
	public List<TreeNode> preIterator(){
		return preIterator(root);
	}

	private List<TreeNode> preIterator(TreeNode node) {
		List<TreeNode> list = new ArrayList<TreeNode>();

		//处理根节点
		list.add(node);

		//递归处理左子树
		if(node.left != null){
			list.addAll(preIterator(node.left));
		}

		//递归处理右子树
		if(node.right != null){
			list.addAll(preIterator(node.right));
		}

		return list;
	}

2、中序遍历

(1)递归遍历左子树

(2)访问根节点

(3)递归遍历右子树

Java实现代码:

public List<TreeNode> inIterator(){
		return inIterator(root);
	}

	private List<TreeNode> inIterator(TreeNode node){
		List<TreeNode> list = new ArrayList<TreeNode>();

		//递归处理左子树
		if(node.left != null){
			list.addAll(inIterator(node.left));
		}

		//处理根节点
		list.add(node);

		//递归处理右子树
		if(node.right != null){
			list.addAll(inIterator(node.right));
		}

		return list;
	}

3、后序遍历

(1)递归遍历左子树

(2)递归遍历右子树

(3)访问根节点

Java实现代码:

public List<TreeNode> postIterator(){
		return postIterator(root);
	}

	private List<TreeNode> postIterator(TreeNode node){
		List<TreeNode> list = new ArrayList<TreeNode>();

		//递归处理左子树
		if(node.left != null){
			list.addAll(postIterator(node.left));
		}

		//递归处理右子树
		if(node.right != null){
			list.addAll(postIterator(node.right));
		}

		//处理根节点
		list.add(node);

		return list;
	}

4、广度优先(按层)遍历

先遍历第一层(根节点),再遍历根节点的两个子节点(第二层)。。。逐层遍历二叉树的所有节点。

为了实现广度优先遍历,可以借助具有“FIFO”特征的队列实现,如下:

(1)建立一个队列(先进先出),把树的根节点压入队列;

(2)从队列中弹出一个节点(第一次弹出的就是根节点),然后把该节点的左、右节点压入队列,如果没有子节点,则说明已经到达叶子节点;

(3)循环重复执行第(2)步,直到队列为空。当队列为空时,说明所有的叶子节点都已经过了队列,也就完成了遍历。

Java实现代码:

public List<TreeNode> breadthFirst(){
		Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
		List<TreeNode> list = new ArrayList<TreeNode>();

		if(root != null){
			//将根元素加入到“队列”
			queue.offer(root);
		}

		while(!queue.isEmpty()){
			//将该队列的“队尾”的元素添加到List中
			list.add(queue.peek());
			TreeNode p = queue.poll();
			//如果左子节点不为null,将它加入到“队列”
			if(p.left != null){
				queue.offer(p.left);
			}

			if(p.right != null){
				queue.offer(p.right);
			}
		}

		return list;
	}

二叉树的遍历及其Java实现

时间: 2024-10-11 11:51:07

二叉树的遍历及其Java实现的相关文章

java生成二叉树和遍历

在java中实现二叉树和链表的方法都是在类中定义该类的对象引用 比如 class Tree { int data; Tree left; Tree right; } 这样的话当我们new一个Tree对象的时候,该对象就拥有了left和right两个对象,这样就起到了连接的 作用,在链表中就是连接了下一个,在树中就相当于边,这样就起到一个接一个的效果.总之,就是吧对象连接起来了. 下面是完整代码 package code; public class TwoTree { public static

【LeetCode-面试算法经典-Java实现】【107-Binary Tree Level Order Traversal II(二叉树层序遍历II)】

[107-Binary Tree Level Order Traversal II(二叉树层序遍历II)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root). For example

二叉树 - 建立与遍历使用Java

二叉树的遍历(traversing binary tree)是指从根节点出发,按照某种次序依次访问二叉树中所有节点,使得每个节点仅被访问一次 前序遍历:若二叉树为空,则空操作返回null.否则先访问根节点,然后前序遍历左子树,再前序遍历右子树 中序遍历:若二叉树为空,则空操作返回null.否则从根节点开始,中序遍历根节点左子树,然后访问根节点,最后中序遍历右子树 后序遍历:若二叉树为空,则空操作返回null.否则以从左到右先叶子后节点的方式遍历访问左右子树,最后访问根节点 层序遍历:若树为空,空

重温数据结构:二叉树的常见方法及三种遍历方式 Java 实现

读完本文你将了解到: 什么是二叉树 Binary Tree 两种特殊的二叉树 满二叉树 完全二叉树 满二叉树 和 完全二叉树 的对比图 二叉树的实现 用 递归节点实现法左右链表示法 表示一个二叉树节点 用 数组下标表示法 表示一个节点 二叉树的主要方法 二叉树的创建 二叉树的添加元素 二叉树的删除元素 二叉树的清空 获得二叉树的高度 获得二叉树的节点数 获得某个节点的父亲节点 二叉树的遍历 先序遍历 中序遍历 后序遍历 遍历小结 总结 树的分类有很多种,但基本都是 二叉树 的衍生,今天来学习下二

【LeetCode-面试算法经典-Java实现】【102-Binary Tree Level Order Traversal(二叉树层序遍历)】

[102-Binary Tree Level Order Traversal(二叉树层序遍历)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level). For example: Given binary tree {3,9,20,#,#,15

java实现二叉树及遍历、删除

java实现二叉树及遍历.删除 个人网站:多猫影视[可以看各大网站的VIP视频]www.duomao.xyz 二叉树是递归定义的,其结点有左右子树之分,逻辑上二叉树有五种基本形态: (1)空二叉树——如图(a): (2)只有一个根结点的二叉树——如图(b): (3)只有左子树——如图(c): (4)只有右子树——如图(d): (5)完全二叉树——如图(e). 注意:尽管二叉树与树有许多相似之处,但二叉树不是树的特殊情形.[1] 类型 (1)完全二叉树——若设二叉树的高度为h,除第 h 层外,其它

java实现二叉树层次遍历

public class BSTNode<T extends Comparable<T>> { T key; // 关键字(键值) BSTNode<T> left; // 左孩子 BSTNode<T> right; // 右孩子 BSTNode<T> parent; // 父结点 public BSTNode(T key, BSTNode<T> parent, BSTNode<T> left, BSTNode<T&g

用java实现二叉树的遍历算法

用java实现二叉树的遍历算法用java实现二叉树的遍历算法,编写二叉树类BinaryTree代码如下:package package2; public class BinaryTree { int data; //根节点数据BinaryTree left; //左子树BinaryTree right; //右子树 public BinaryTree(int data) //实例化二叉树类{this.data = data;left = null;right = null;} public vo

Java数据结构-二叉树及其遍历

二叉树的定义:n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互相不相交的.分别称为根结点的左子树和右子树的二叉树组成. 二叉树的特点: 0<=度<=2: 左右子树是有顺序的,不能颠倒: 不论有几棵子树,也要区分它是左子树还是右子树. 二叉树的五种基本形态: 空二叉树: 只有一个根结点: 根结点只有左子树: 根结点只有右子树: 根结点既有左子树又有右子树. 举例3个结点的二叉树的形态有: 下面说一些特殊的二叉树. 斜树:所有的结点都只有左子树的二叉