最近复习数据结构中的二叉树的相关问题,在这里整理一下
这里包括:
1、二叉树的先序创建
2、二叉树的递归先序遍历
3、二叉树的非递归先序遍历
4、二叉树的递归中序遍历
5、二叉树的非递归中序遍历
6、二叉树的递归后序遍历
7、二叉树的非递归后序遍历
8、二叉树的层次遍历
- /**二叉树的结点定义*/
- class Node<T>{
- private T value;
- private Node<T> left;
- private Node<T> right;
- public Node(){
- }
- public Node(Node<T> left, Node<T> right, T value){
- this.left = left;
- this.right = right;
- this.value = value;
- }
- public Node(T value){
- this(null, null, value);
- }
- public Node<T> getLeft(){
- return this.left;
- }
- public void setLeft(Node<T> left){
- this.left = left;
- }
- public Node<T> getRight(){
- return this.right;
- }
- public void setRight(Node<T> right){
- this.right = right;
- }
- public T getValue(){
- return this.value;
- }
- public void setValue(T value){
- this.value = value;
- }
- }
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.util.LinkedList;
- import java.util.Scanner;
- /**
- * 二叉树的定义:或为空,或只有根节点,或有左子树和右子树(5种基本形态)
- * 二叉树性质:
- * 1、在二叉树的第i层上至多有2^(i-1)个结点(i>=1)
- * 2、深度为k的二叉树至多有2^(k) - 1个结点(k>=1)
- * 3、对于任何一颗二叉树,如果其终端结点数为n,度数为2的结点数为m,则n = m + 1
- * 4、具有n个结点的完全二叉树的深度为k = floor(log2(n)) + 1
- * 5、在含有n个结点的二叉链表中有n+1个空链域
- *
- * @author 小菜鸟
- *创建时间:2014-08-10
- */
- public class BinaryTree<T> {
- /**二叉树的根节点*/
- private Node<T> root;
- public BinaryTree(){}
- public BinaryTree(Node<T> root){
- this.root = root;
- }
- /**先序遍历创建二叉树*/
- /**input.txt: - + a # # * # # / e # # f # #
- * # 代表空结点
- */
- public void createBiTree(){
- Scanner scn = null;
- try {
- scn = new Scanner(new File("input.txt"));
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- }
- this.root = createBiTree(root, scn);
- }
- private Node<T> createBiTree(Node<T> node, Scanner scn) {
- String temp = scn.next();
- if(temp.trim().equals("#")){
- return null;
- }
- else{
- node = new Node<T>((T)temp);
- node.setLeft(createBiTree(node.getLeft(), scn));
- node.setRight(createBiTree(node.getRight(), scn));
- return node;
- }
- }
- /**先序递归遍历二叉树*/
- public void preOrderTraverse(){
- preOrderTraverse(root);
- }
- private void preOrderTraverse(Node<T> node) {
- if(node != null){
- System.out.println(node.getValue());
- preOrderTraverse(node.getLeft());
- preOrderTraverse(node.getRight());
- }
- }
- /**先序非递归遍历二叉树*/
- public void nrPreOrderTraverse(){
- Stack<Node<T>> stack = new Stack<Node<T>>();
- Node<T> node = root;
- while(node != null || !stack.isEmpty()){
- while(node != null){
- System.out.println(node.getValue());
- stack.push(node);
- node = node.getLeft();
- }
- node = stack.pop();
- node = node.getRight();
- }
- }
- /**中序递归遍历二叉树*/
- public void inOrderTraverse(){
- inOrderTraverse(root);
- }
- private void inOrderTraverse(Node<T> node) {
- if(node != null){
- inOrderTraverse(node.getLeft());
- System.out.println(node.getValue());
- inOrderTraverse(node.getRight());
- }
- }
- /**中序非递归遍历二叉树*/
- public void nrInOrderTraverse(){
- Stack<Node<T>> stack = new Stack<Node<T>>();
- Node<T> node = root;
- while(node != null || !stack.isEmpty()){
- while(node != null){
- stack.push(node);
- node = node.getLeft();
- }
- node = stack.pop();
- System.out.println(node.getValue());
- node = node.getRight();
- }
- }
- /**后序递归遍历二叉树*/
- public void postOrderTraverse(){
- postOrderTraverse(root);
- }
- private void postOrderTraverse(Node<T> node) {
- if(node != null){
- postOrderTraverse(node.getLeft());
- postOrderTraverse(node.getRight());
- System.out.println(node.getValue());
- }
- }
- /**后序非递归遍历二叉树*/
- public void nrPostOrderTraverse(){
- Stack<Node<T>> stack = new Stack<Node<T>>();
- Node<T> node = root;
- Node<T> preNode = null; //记录之前遍历的右结点
- while(node != null || !stack.isEmpty()){
- while(node != null){
- stack.push(node);
- node = node.getLeft();
- }
- node = stack.getTop();
- /**如果右结点为空,或者右结点之前遍历过,打印根结点*/
- if(node.getRight() == null || node.getRight() == preNode){
- System.out.println(node.getValue());
- node = stack.pop();
- preNode = node;
- node = null;
- }
- else{
- node = node.getRight();
- }
- }
- }
- /**层次遍历二叉树*/
- public void levelTraverse(){
- levelTraverse(root);
- }
- private void levelTraverse(Node<T> node) {
- Queue<Node<T>> queue = new Queue<Node<T>>();
- queue.push(node);
- while(!queue.isEmpty()){
- node = queue.pop();
- if(node != null){
- System.out.println(node.getValue());
- queue.push(node.getLeft());
- queue.push(node.getRight());
- }
- }
- }
- public static void main(String[] args){
- BinaryTree<String> bt = new BinaryTree<String>();
- bt.createBiTree();
- //bt.preOrderTraverse();
- //bt.inOrderTraverse();
- //bt.postOrderTraverse();
- //bt.nrPreOrderTraverse();
- //bt.nrInOrderTraverse();
- //bt.nrPostOrderTraverse();
- bt.levelTraverse();
- }
- }
相关推荐
在提供的"二叉树的递归和非递归遍历"压缩包文件中,可能包含了Java源代码,演示了如何实现这两种遍历方式。通过阅读和理解这些代码,你可以更好地掌握二叉树遍历的原理和实践,这对于理解和解决涉及二叉树的算法问题...
非递归遍历通常使用栈来辅助实现,具体分为以下几种方式: 1. **非递归前序遍历**: - 使用一个栈来保存待访问的节点。 - 如果当前节点不为空,则将其入栈,并将当前节点设置为其左孩子。 - 当栈不为空时,从栈...
java实现二叉树非递归前序中序后序遍历
详细介绍了JAVA中二叉树的非递归遍历方式,三种方式都是采用栈来辅助完成,其中前序遍历采用的是先入右子节点再入左子节点的方法,这样弹出栈时左在前,右在后。中序遍历的话则是要先一直到达最左的子节点,然后才弹...
如果你用C或者C++或者其他高级语言写过二叉树或者阅读过相关方面代码,应该知道二叉树的非递归遍历避不开通过栈或者队列实现。是的,python也一样。但是python自带的list功能很强大,即可以当stack
编写先序遍历二叉树的非递归算法程序,要求: (1)以二叉链表建立二叉树。 (2)输出遍历的结点序列。 (3)有实例验算。
下面将详细介绍这些遍历方法及其递归和非递归实现。 1. **前序遍历**: - **描述**:前序遍历的顺序是“根-左-右”。首先访问根节点,然后递归地访问左子树,最后访问右子树。 - **递归实现**: ```java void ...
非递归遍历通常使用栈来实现。以中序遍历为例,Java代码如下: ```java public void inOrderTraversal(TreeNode node) { Stack<TreeNode> stack = new Stack(); TreeNode curr = node; while (curr != null || ...
java语言实现的二叉树的各种操作(包括递归与非递归遍历二叉树,求二叉树的高度,节点总数,叶子节点等)
在提供的压缩包文件“二叉树遍历(非递归)”中,可能包含具体的代码示例,这些示例可能涵盖了上述理论的实现,帮助你更好地理解和应用非递归遍历二叉树的方法。通过阅读和分析这些代码,你可以加深对二叉树遍历的...
在`MyBinaryTree2.java`和`MyBinaryTree.java`这两个文件中,可能分别实现了递归和非递归的遍历方法。你可以打开这些文件,查看代码并理解其中的逻辑,以加深对二叉树遍历的理解。此外,实践是最好的老师,你可以...
代码中`recursePreOrder()`函数实现了递归的前序遍历,而`stackPreOrder()`则使用了栈来辅助非递归前序遍历。在非递归方法中,首先访问根节点,然后将左子树压入栈中,接着处理左子树的左子节点,直到没有左子节点...
二叉树的非递归遍历运算 建立二叉树的三叉链式存储结构,在此基础上完成下列算法: 1) 从键盘上输入二叉树的各个结点,建立三叉链表 2) 输出该二叉树 3) 非递归的层次遍历算法 4) 非递归的先序遍历、中序遍历、...
"Java二叉树的遍历" Java二叉树的遍历是指对二叉树的节点进行访问和处理的过程。二叉树的遍历可以分为递归遍历和非递归遍历两种方式,分别对应递归函数...非递归遍历的优点是可以避免栈溢出,但代码实现起来较为复杂。
在 Java 中,也可以使用栈来实现非递归遍历方式。 (1)非递归先序遍历 void PreOrder2(BiTree T){ stack<BiTree> stack; BiTree p = T; while(p || !stack.empty()){ if(p != NULL){ stack.push(p); p = p-...
非递归实现同样可以借助栈,但需要在适当的时候(左子树为空或已遍历完)访问根节点。 3. **后序遍历**: 后序遍历的顺序是:左子树 -> 右子树 -> 根节点。这种遍历方式常用于计算表达式树或复制树等场景。递归...
在本话题中,我们将重点讨论链式二叉树的中序遍历,包括递归和非递归的方法,以及如何创建和销毁这种数据结构。 一、链式二叉树的中序创建 中序创建链式二叉树通常涉及自底向上的构建过程。首先,我们需要创建一个...
非递归遍历通常借助栈的数据结构来实现。 **1. 前序遍历** 前序遍历的非递归实现可以通过栈来辅助: ```java public void iterativePreOrderTraverse(Node root) { Stack<Node> nodes = new Stack(); if (root !...
总结来说,二叉树的递归遍历简洁明了,而非递归遍历则需要借助额外的数据结构(如栈)来控制访问顺序。在实际应用中,选择哪种方式取决于具体需求,例如内存限制、代码可读性等因素。理解这两种遍历方式对于掌握数据...
非递归中序遍历是一种在不使用递归方法的情况下遍历二叉树的策略,主要依赖于数据结构栈来实现。在这个Java代码示例中,我们看到的是如何使用栈来执行非递归中序遍历的过程。首先,让我们详细了解二叉树和中序遍历的...