二叉树是计算机中一个重要的数据结构,在这里主要谈一下二叉树的深度优先搜索(DFS)和广度优先搜索(BFS)。
所谓DFS,就是沿着树的深度一直往下,一直到达一个叶子节点,然后再返回遍历剩余的节点。根据树的性质,树结构不存在环,因此遍历的时候不需要标记。如果在遍历一个图的时候,因为图中有环的存在,因此需要标记访问过的节点,以防止程序进入死循环。言归正传,树的DFS有三种方式,分别为:前序遍历,中序遍历,和后序遍历。根据这个性质,我们很容易想到用堆栈完成DFS。遍历的时候我们将元素压栈,利用堆栈后进先出的性质来实现不同的遍历。
所谓前序遍历,就是每次都先访问根节点,然后依次为左子树,和右子树。根据前序遍历的规定,左子树先于右子树,依次压栈的时候从右子树开始。代码如下:
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
Stack<TreeNode> stack = new Stack<TreeNode>();
if(root == null) return list;
stack.push(root);
while(!stack.empty()) {
TreeNode node = stack.pop();
list.add(node.val);
if(node.right != null)
stack.push(node.right);
if(node.left != null)
stack.push(node.left);
}
return list;
}
}
中序遍历是从左子树开始,然后依次为根节点,右子树,注意这里的根节点是指的每个子树的根结点。代码如下:
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
Stack<TreeNode> stack = new Stack<TreeNode>();
if (root == null) return list;
while(!stack.empty() || root != null) {
if(root != null){
stack.push(root);
root = root.left;
} else {
root = stack.pop();
list.add(root.val);
root = root.right;
}
}
return list;
}
后序遍历是先遍历左子树,然后依次为右子树,根节点。因为根节点在最后遍历,所以在程序完成时如果按照左右根的方式会比较繁琐。我们不妨换一下思路,在完成前序遍历后,我们发现前序遍历是根->左->右,后序遍历时左->右->根,如果我们按照根->右->左的方式进行遍历,然后把结果倒转,就是左->右->根了。代码如下:
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public List<Integer> postorderTraversal(TreeNode root) {
LinkedList<Integer> list = new LinkedList<Integer>();
Stack<TreeNode> stack = new Stack<TreeNode>();
if(root == null)
return list;
stack.push(root);
while(!stack.empty()) {
TreeNode node = stack.pop();
list.addFirst(node.val);
if(node.left != null)
stack.push(node.left);
if(node.right != null)
stack.push(node.right);
}
return list;
}
以上我们介绍了二叉树的三种遍历方式,它们都属于深度优先遍历,对于深度优先遍历,我们都用堆栈实现。接下来我们介绍一下二叉树的广度优先遍历。
BFS,即广度优先遍历,它时沿着树的宽度进行遍历,从第一层直到最后一层,一直到遍历完树中所有的节点。对于BFS,我们通常用队列来实现,队列先进先出的性质正好满足BFS的要求。
我们先从根节点开始,然后加入到队列中,依次为左子树,右子树,然后每次从队列中取出一个节点,都一次访问它的左孩子和右孩子,直到遍历完所有的节点。代码如下:
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public void BFS(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
Queue<TreeNode> queue = new LinkedList<TreeNode>();
if(root == null) return list;
queue.offer(root);
while(!queue.isEmpty()) {
TreeNode node = queue.poll();
list.add(node.val);
if(node.left != null)
queue.offer(node.left);
if(node.right != null)
queue.offer(node.right);
}
return list;
}
分享到:
相关推荐
而BFS则能保证找到最短路径(如在无权图中找最短路径、二叉树的层次遍历等)。选择哪种遍历方式取决于具体的应用场景。 在实际编程中,我们需要根据题目需求和图的特性选择合适的图数据结构和遍历方法。例如,如果...
二叉树的遍历以及怎样进行二叉树的深搜和广搜
二叉树有多种变体,如满二叉树、完全二叉树和平衡二叉树(如AVL树和红黑树),它们在搜索、排序和文件系统等领域有广泛应用。 **深度优先搜索(DFS)** 和**广度优先搜索(BFS)** 是图和树遍历的两种基本方法。DFS...
根据给定的信息,本文将详细介绍二叉树的基本概念及其在程序中的实现方法,包括二叉树的创建、遍历(前序、中序、后序)、复制、求高度、判断是否为完全二叉树以及利用二叉树进行表达式的计算等操作。 ### 一、...
适合大学生,学生党学习c++的二叉树的广度搜索遍历的c++程序。
ds18b20二叉树搜索算法.pdf 这篇文章主要介绍了ds18b20二叉树搜索算法的原理和实现。下面是文章中提到的知识点: 1. 单总线技术:单总线技术是一种简单的三步操作过程的重复,即先读一位,接着读该位的反码,然后...
二叉树是一种特殊的树结构,每个节点最多有两个子节点,通常称为左子节点和右子节点。这种数据结构在计算机科学中广泛应用于搜索、排序、表达式求解等多种任务。在MIT的这门课程中,Lec3和Lec4分别深入探讨了二叉树...
并根据自己的理解重新进行了整理本文持续更新中本文收录于一、计算机基础1...二叉树哈弗曼树二叉查找树B、B+、B*树LSM树字典树红黑树线段树(3)图最小生成树最短路径算法拓扑排序深搜和广搜(4)排序算法选择排序冒泡...
1、 定义链接存储的二叉树类。 2、 实验验证如下算法的正确性、各种功能及指标: 1) 创建一棵二叉树,并对其初始化; 2)先根、中根、后根遍历二叉树; 3) 在二叉树中搜索给定结点的父结点; 4) 搜索二叉树中符合...
前序递归创建搜索二叉树,对搜索二叉树进行搜索,在搜索二叉树中插入某一个数,在二叉树中删除指定的某一个数。
4.掌握计算二叉树的结点个数、二叉树的深度、二叉树的叶子结点和二叉树复制算法。 二、实验内容 1、构造基于先序遍历的二叉链表。 要求:按先序遍历规则,从键盘连续输入二叉树的先序序列,若无孩子结点,则用#代替...
二叉树是一种特殊的树结构,每个节点最多只有两个子节点,通常分为左子节点和右子节点。在计算机科学中,二叉树被广泛应用于数据的组织和操作,如搜索、排序、文件系统等。本例子关注的是如何实现二叉树的图形显示,...
二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py...
在计算机科学中,二叉树是一种广泛应用于各种算法和问题解决中的基础数据结构。它不仅是学习数据结构和算法课程不可或缺的一部分,而且在实际的计算机系统中也发挥着极其重要的作用。为了帮助学生和自学者加深对...
而二叉树(Binary Tree)作为一种特殊的数据结构,是数据结构学习中的核心概念之一。二叉树是由n(n≥0)个有限节点组成的一个具有层次关系的集合,通常表示为一个由根节点、若干子树及叶子节点构成的分层结构。 ...
二叉树横向打印算法的实现 二叉树是一种基本的数据结构,在计算机科学和编程中广泛应用。本资源介绍了一种特殊的二叉树打印算法,即横向打印二叉树结构。该算法将二叉树的根节点放在屏幕的最左边,左子树在屏幕的...
在计算机科学领域,二叉树是一种基础的数据结构,它由结点构成,每个结点最多有两个子节点,分别称为左子节点和右子节点。在众多的二叉树操作中,根据后序遍历序列(也称为后序序列)来构造二叉树是一项常见的任务。...
在IT领域,特别是数据结构和算法的学习中,二叉树是一种重要的抽象数据类型。满二叉树是一种特殊的二叉树,其中每一层都是完全填充的,除了可能的最后一层,且最后一层的所有节点都尽可能地向左靠拢。而将满二叉树...
(2)先序、中序、后序遍历二叉树:递归算法。 (3)中序遍历二叉树:非递归算法(最好也能实现先序,后序非递归算法)。 (4)求二叉树的高度 。 (5)求二叉树的叶子个数。 (6)对于树中每一个元素值为x的结点...