1.二叉树,一种递归的数据结构,一棵非空的二叉树由根节点以及左右子树组成。
且看图:
在任一给定结点上,可以按某种次序执行三个操作:
1)访问结点本身(N)
2)遍历该结点的左子树(L)
3)遍历该结点的右子树(R)
因此根据这三种操作的先后次序,可分为:
a)NLR 前序遍历 (PreorderTraversal亦称(先序遍历))——访问根结点的操作发生在遍历其左右子树之前。
b)LNR 中序遍历 (InorderTraversal)——访问根结点的操作发生在遍历其左右子树之中。
c)LRN 后序遍历 (PostorderTraversal)——访问根结点的操作发生在遍历其左右子树之后。
什么先根,中根,后根是同一东西。注意,无论哪种次序,每个节点只被访问一次。
以下是示例,基于下图实验:
1.TreeNode.java
package tree; public class TreeNode { public int key; public TreeNode leftNode; public TreeNode rightNode; public TreeNode(int key, TreeNode leftNode, TreeNode rightNode) { this.key = key; this.leftNode= leftNode; this.rightNode = rightNode; } }
2.BrinaryTree.java —— 构造上图的二叉树
TreeNode leftLeaf1 = new TreeNode(4, null, null); TreeNode rightLeaf1 = new TreeNode(5, null, null); TreeNode rightLeaf2 = new TreeNode(6, null, null); TreeNode leftTree = new TreeNode(2, leftLeaf1, rightLeaf1); TreeNode rightTree = new TreeNode(3, null, rightLeaf2); TreeNode root = new TreeNode(1, leftTree, rightTree);
前序算法实现(递归)
/** * 递归前序排列 */ public void recursePostOrder(TreeNode root) { if(root == null) return; root.accessMe(); if(root.leftNode != null) { recursePostOrder(root.leftNode); } if(root.rightNode != null) { recursePostOrder(root.rightNode); } }
前序算法实现(非递归)
/** * 非递归的前序遍历 */ public void stackPreOrder(TreeNode root) { if(root == null) return; Stack<TreeNode> stack = new Stack<TreeNode>(); stack.push(root); root.accessMe(); TreeNode tmp = root.leftNode; while(tmp != null) { stack.push(tmp); tmp.accessMe(); tmp = tmp.leftNode; } tmp = stack.pop(); while(tmp != null) { tmp = tmp.rightNode; while(tmp != null) { stack.push(tmp); tmp.accessMe(); tmp = tmp.leftNode; } if(stack.isEmpty()) { break; } tmp = stack.pop(); } }
前序结果:1 2 4 5 3 6
中序算法实现(递归)
public void recurseInOrder(TreeNode root) { if(root == null) return; if(root.leftNode != null) { recurseInOrder(root.leftNode); } root.accessMe(); if(root.rightNode != null) { recurseInOrder(root.rightNode); } }
中序算法实现(非递归)
/** * 非递归的中序遍历 */ public void stackInOrder(TreeNode root) { if(root == null) return; Stack<TreeNode> stack = new Stack<TreeNode>(); stack.push(root); TreeNode tmp = root.leftNode; while(tmp != null) { stack.push(tmp); tmp = tmp.leftNode; } tmp = stack.pop(); while(tmp != null) { tmp.accessMe(); tmp = tmp.rightNode; while(tmp != null) { stack.push(tmp); tmp = tmp.leftNode; } if(stack.isEmpty()) { break; } tmp = stack.pop(); } }中序结果:4 2 5 1 3 6
后序算法实现(递归)
/** * 递归后序排列 */ public void recursePostOrder(TreeNode root) { if(root == null) return; if(root.leftNode != null) { recursePostOrder(root.leftNode); } if(root.rightNode != null) { recursePostOrder(root.rightNode); } root.accessMe(); }
后序算法实现(非递归)
/** * 非递归的后序遍历 */ public void stackPostOrder(TreeNode root) { if(root == null) return; Stack<TreeNode> stack = new Stack<TreeNode>(); TreeNode tmp = root; while(root!=null){ while(root.leftNode != null) { stack.push(root); root = root.leftNode; } while(root != null && (root.rightNode == null || root.rightNode == tmp )) { root.accessMe(); tmp = root; if(stack.isEmpty()) return; root = stack.pop(); } stack.push(root); root = root.rightNode; } }后序结果:4 5 2 6 3 1
2.排序
指定的元素插入二叉排序树中
/** * 指定的元素插入二叉排序树中 */ public void insertTree(TreeNode root, int key){ if(root != null) { int value = root.key; if(key < value) { if(root.leftNode == null) { TreeNode node = new TreeNode(key, null, null); root.leftNode = node; }else { insertTree(root.leftNode, key); } }else if(key > value) { if(root.rightNode == null) { TreeNode node = new TreeNode(key, null, null); node.rightNode = node; }else { insertTree(root.rightNode, key); } } }else { root = new TreeNode(key, null, null); } }
根据key查找某一元素
/** * 根据key查找 */ public TreeNode searchTree(TreeNode root, int key) { if(root == null) { return null; }else { if(key == root.key) { return root; }else if(key < root.key) { return searchTree(root.leftNode, key); }else { return searchTree(root.rightNode, key); } } }
相关推荐
2.用递归及非递归算法对二叉树实现先序遍历; 3.用递归及非递归算法对二叉树实现中序遍历; 4.用递归及非递归算法对二叉树实现后序遍历。 5.用递归遍历算法中的访问结点的操作修改为叶结点计数,统计度为0的;度为1...
本资料包“基于C语言的实例二叉树建立遍历冒泡排序快速排序源码.zip”提供了一套完整的示例,涵盖了二叉树的构建、遍历、以及两种常见的排序算法——冒泡排序和快速排序的C语言实现。 首先,让我们来探讨二叉树这一...
《数据结构课程设计实例解析:二叉树、遍历、冒泡排序与快速排序》 在计算机科学领域,数据结构是编程的基础,它涉及到如何高效地存储和组织数据。本项目集成了多种语言,包括Java、Python、VB、C++和PHP,提供了10...
本课程设计实例集合了10个核心的数据结构问题,包括二叉树的建立、遍历,以及常用的排序算法——冒泡排序和快速排序。下面将详细解析这些知识点。 一、数据结构 数据结构是编程中用于组织和管理大量数据的方法。...
在本课程设计中,包含了两种常见的排序算法——冒泡排序和快速排序。冒泡排序是一种简单的交换排序,通过重复遍历数组,比较相邻元素并交换位置,直到数组排序完成。虽然效率较低,但其逻辑简单,适合初学者理解。...
本课程设计集合了10个数据结构相关的实例,包括二叉树的建立、遍历,以及两种常见的排序算法——冒泡排序和快速排序。这些内容都是计算机科学特别是编程学习中的核心部分,对于理解和掌握C语言编程有着深远的影响。 ...
本课程设计实例聚焦于10个关键的数据结构问题,其中包括二叉树的建立、遍历,以及两种常见的排序算法——冒泡排序和快速排序。 一、数据结构基础 数据结构是存储和组织数据的方式,它可以是简单的线性结构如数组或...
通过阅读和理解这些代码,你可以更好地掌握二叉树遍历的逻辑和实现细节。在实践中,这些遍历方法经常被用于解决各种问题,例如搜索、排序、复制二叉树等。 总结一下,了解和掌握二叉树的四种遍历方法对于学习数据...
2. 中序遍历(Inorder Traversal):在二叉树中,中序遍历常用于生成排序序列。访问顺序为:左-根-右。对于非二叉树,中序遍历可能需要根据树的具体性质定义。 3. 后序遍历(Postorder Traversal):先遍历左子树,...
本资料“数据结构 二叉树三种遍历的非递归算法(背诵版)”着重介绍了二叉树的三种主要遍历方法——前序遍历、中序遍历和后序遍历的非递归实现。 **前序遍历**: 前序遍历的顺序是:根节点 -> 左子树 -> 右子树。非...
`二叉树遍历.cpp`、`二叉树遍历终结版.cpp`、`二叉树遍历更简单.cpp` 这些文件可能是不同版本的C++代码实现,可能包含不同的算法优化或者改进,比如使用迭代而非递归,或者利用双端队列(deque)来简化后序遍历的...
本文将深入探讨C++中的数据结构之一——二叉树,并重点讲解如何实现二叉树的层序遍历。层序遍历,也称为宽度优先搜索(BFS),是一种在二叉树中遍历节点的常用方法,它按照从上至下、从左到右的顺序逐层访问所有节点...
在实际应用中,二叉树遍历算法不仅限于简单的打印节点值,还可以用于查找、插入、删除等操作。例如,在二叉搜索树中,中序遍历可以快速找到一个特定的元素;而在构建表达式树时,后序遍历可以帮助我们求解表达式的值...
总之,二叉树遍历是数据结构与算法中的基础操作,理解和掌握各种遍历方法对于解决计算机科学中的许多问题至关重要。通过对二叉树的前序、中序、后序以及层序遍历的理解和实践,我们可以更好地处理树形数据结构,提高...
### 数据结构实验报告——二叉树 #### 实验概述与目的 本次实验的主题是围绕“二叉树”这一核心概念展开。二叉树作为一种重要的非线性数据结构,在计算机科学中有着广泛的应用,例如在搜索算法、排序算法、编译器...
【数据结构实验——分类二叉树和堆排序】 在数据结构的学习中,分类二叉树和堆排序是两个重要的概念,它们在实际的编程和算法设计中有着广泛的应用。本实验旨在让学生深入理解和掌握这两种数据结构及其操作。 分类...
二叉树常用于计算机科学中的算法设计,比如搜索、排序以及表达式求解等场景。 在二叉树中,存在几种特殊的类型: 1. **满二叉树**:高度为h的满二叉树拥有2^h - 1个节点。这样的树每一层都是完全填满的,并且所有...