`
128kj
  • 浏览: 601376 次
  • 来自: ...
社区版块
存档分类
最新评论

二叉树的二叉链实现及遍历

阅读更多
建立如图的二叉树并遍历:


import java.util.*;   
  
public class BinaryTree {   
    protected Node root;   
  
    public BinaryTree(Node root) {   
        this.root = root;   
    }   
  
    public Node getRoot() {   
        return root;   
    }   
  
    /** 构造树 */  
    public static Node init() {   
        Node a = new Node('A');   
        Node b = new Node('B', null, a);   
        Node c = new Node('C');   
        Node d = new Node('D', b, c);   
        Node e = new Node('E');   
        Node f = new Node('F', e, null);   
        Node g = new Node('G', null, f);   
        Node h = new Node('H', d, g);   
        return h;// root   
    }   
  
    /** 访问节点 */  
    public static void visit(Node p) {   
        System.out.print(p.getKey() + " ");   
    }   
  
    /** 递归实现前序遍历 */  
     static void preorder(Node p) {   
        if (p != null) {   
            visit(p);   
            preorder(p.getLeft());   
            preorder(p.getRight());   
        }   
    }   
  
    /** 递归实现中序遍历 */  
     static void inorder(Node p) {   
        if (p != null) {   
            inorder(p.getLeft());   
            visit(p);   
            inorder(p.getRight());   
        }   
    }   
  
    /** 递归实现后序遍历 */  
     static void postorder(Node p) {   
        if (p != null) {   
            postorder(p.getLeft());   
            postorder(p.getRight());   
            visit(p);   
        }   
    }   

   /** 层次遍历*/
   static void levelorder(Node p){   
        if(p==null) return;   
        Queue<Node> queue=new LinkedList<Node>();   
        queue.offer(p);   
        while(queue.size()>0){   
            Node temp=queue.poll();   
            visit(temp); 
            if(temp.getLeft()!=null){   
                queue.offer(temp.getLeft());   
            }   
            if(temp.getRight()!=null){   
                queue.offer(temp.getRight());   
            }   
        }   
       
    }   

  
    /** 非递归实现前序遍历 */  
    static void iterativePreorder(Node p) {   
        Stack<Node> stack = new Stack<Node>();   
        if (p != null) {   
            stack.push(p);   
            while (!stack.empty()) {   
                p = stack.pop();   
                visit(p);   
                if (p.getRight() != null)   
                    stack.push(p.getRight());   
                if (p.getLeft() != null)   
                    stack.push(p.getLeft());   
            }   
        }   
    }   
  
  
  
    /** 非递归实现后序遍历 单栈法*/  
     static void iterativePostorder(Node p) {   
        Stack<Node> stack = new Stack<Node>();   
        Node node = p, prev = p;   
        while (node != null || stack.size() > 0) {   
            while (node != null) {   
                stack.push(node);   
                node = node.getLeft();   
            }   
            if (stack.size() > 0) {   
                Node temp = stack.peek().getRight();   
                if (temp == null || temp == prev) {   
                    node = stack.pop();   
                    visit(node);   
                    prev = node;   
                    node = null;   
                } else {   
                    node = temp;   
                }   
            }   
  
        }   
    }   
  
   
  
   
  
    /** 非递归实现中序遍历 */  
     static void iterativeInorder(Node p) {   
        Stack<Node> stack = new Stack<Node>();   
        Node node = p;   
        while (node != null || stack.size() > 0) {   
            while (node != null) {   
                stack.push(node);   
                node = node.getLeft();   
            }   
            if (stack.size() > 0) {   
                node = stack.pop();   
                visit(node);   
                node = node.getRight();   
            }   
        }   
    }   
  
    // 求二叉树的高度
 static int height(Node tree) {
    if (tree == null)
	return 0;
    else {
	int leftTreeHeight = height(tree.getLeft());
	int rightTreeHeight = height(tree.getRight());;
	return leftTreeHeight > rightTreeHeight ? leftTreeHeight + 1: rightTreeHeight + 1;
    }
}

// 求二叉树的结点总数
  static int nodes(Node tree) {
   if (tree == null)
	return 0;
   else {
	int left = nodes(tree.getLeft());
	int right = nodes(tree.getRight());
	return left + right + 1;
  }
}


// 求二叉树叶子节点的总数
 static int leaf(Node tree) {
   if (tree == null)
	return 0;
   else {
	int left = leaf(tree.getLeft());
	int right = leaf(tree.getRight());
	if (tree.getLeft() == null && tree.getRight() == null)
		return left + right + 1;
	else
		return left + right;
    }
 }


    /**  
     * @param args  
     */  
    public static void main(String[] args) {   
        BinaryTree tree = new BinaryTree(init());   
        System.out.print(" 前序遍历:");   
        preorder(tree.getRoot());   
        System.out.println();   
        System.out.print(" 中序遍历:");   
        inorder(tree.getRoot());   
        System.out.println();   
        System.out.print(" 后序遍历:");   
        postorder(tree.getRoot());   
        System.out.println(); 
        System.out.println(); 

        System.out.print(" 非递归前序遍历:");   
        iterativePreorder(tree.getRoot());   
        System.out.println();   
        System.out.print(" 非递归中序遍历:");   
        iterativeInorder(tree.getRoot());   
        System.out.println();   
       
       
        System.out.print(" 非递归后序遍历:");   
        iterativePostorder(tree.getRoot());   
        System.out.println();   
       
        System.out.println("层次遍历");
        levelorder(tree.getRoot());
        System.out.println();   
        System.out.println();   

         System.out.println("叶子结点数");
         System.out.println(leaf(tree.getRoot()));
         System.out.println("总结点数");
         System.out.println(nodes(tree.getRoot()));
         System.out.println("树的高度");
         System.out.println(height(tree.getRoot()));


     
    }    
  
}  

public class Node {   
    private char key;   
    private Node left, right;   
  
    public Node(char key) {   
        this(key, null, null);   
    }   
  
    public Node(char key, Node left, Node right) {   
        this.key = key;   
        this.left = left;   
        this.right = right;   
    }   
  
    public char getKey() {   
        return key;   
    }   
  
    public void setKey(char key) {   
        this.key = key;   
    }   
  
    public Node getLeft() {   
        return left;   
    }   
  
    public void setLeft(Node left) {   
        this.left = left;   
    }   
  
    public Node getRight() {   
        return right;   
    }   
  
    public void setRight(Node right) {   
        this.right = right;   
    }   
} 


运行:
前序遍历:H D B A C G F E
中序遍历:B A D C H G E F
后序遍历:A B C D E F G H

非递归前序遍历:H D B A C G F E
非递归中序遍历:B A D C H G E F
非递归后序遍历:A B C D E F G H
层次遍历
H D G B C F A E

叶子结点数
3
总结点数
8
树的高度
4

下载源码:
  • 大小: 1.4 KB
分享到:
评论

相关推荐

    将有双亲域的二叉链表进行中序遍历的递推式算法

    将有双亲域的二叉链表进行中序遍历的递推式算法

    数据结构 建立二叉树二叉链表存储结构实现有关操作 实验报告

    ### 数据结构:建立二叉树二叉链表存储结构实现有关操作 #### 一、实验题目及背景 本次实验的主要任务是通过建立二叉树的二叉链表存储结构来实现特定的操作。二叉树是一种重要的非线性数据结构,在计算机科学中有...

    二叉树建立及遍历算法实现

    建立二叉树,实现二叉树的先序、中序、后序的递归遍历算法,输出遍历结果。 实现二叉树的先序、中序、后序和层次遍历的非递归算法,输出遍历结果。

    二叉树的创建及其遍历

     按先序遍历的扩展序列建立二叉树的二叉链表存储结构,实现二叉树先序、中序、后序遍历的递归算法,实现二叉树中序遍历的非递归算法,实现二叉树层次遍历的非递归算法(要求使用顺序队列,调用顺序队列基本操作...

    广义表形式建立二叉树,并按层次遍历该二叉树

    二叉树采用二叉链表结构表示。设计并实现如下算法:输入某棵二叉树的广义表形式,建立该二叉树,并按层次遍历该二叉树

    数据结构C++二叉树的先序遍历、中序遍历和后序遍历实现

    数据结构C++二叉链表的先序遍历、中序遍历和后序遍历实现

    二叉树的建立和遍历算法

    二叉树的建立和遍历算法 数据结构课程设计用

    二叉树各种遍历算法的C++实现

    在这个主题中,我们将深入探讨二叉树的三种主要遍历方法:前序遍历、中序遍历和后序遍历,以及它们在C++中的实现方式。 1. **前序遍历**:前序遍历的顺序是根节点 -&gt; 左子树 -&gt; 右子树。在C++中,递归实现可以如下...

    先序创建二叉树,并且层次遍历

    ### 数据结构知识点:先序创建二叉树及层次遍历 #### 一、知识点概述 在计算机科学领域,数据结构是研究如何组织和存储数据的关键技术之一。其中,二叉树作为一种基本的数据结构,在实际应用中有着广泛的应用场景...

    二叉树的各种遍历,二叉搜索树的建立,前中序构建二叉树

    首先,我们要了解二叉树的三种基本遍历方式:前序遍历、中序遍历和后序遍历。这些遍历方法主要通过递归和非递归两种方式实现。 1. **前序遍历**(根-左-右):首先访问根节点,然后递归地遍历左子树,最后遍历右子...

    二叉链树遍历(非递归) C++

    C++用非递归算法(用栈实现前序、中序、后序遍历;用队列实现层次遍历)实现二叉树的遍历。

    erchashubianli.rar_用二叉链表 进行 二叉树 遍历

    本文主要探讨如何使用二叉链表来存储二叉树,并实现四种基本遍历方法:先序遍历、中序遍历、后序遍历和按层遍历。同时,我们还将讨论如何交换二叉树所有节点的左右子树。 首先,二叉链表是二叉树的一种存储方式,每...

    二叉树的建立及递归遍历

    在“二叉树的建立及递归遍历”这个主题中,我们将探讨如何创建二叉树以及如何通过递归方法来遍历它。创建二叉树通常涉及将数据结构化为树的形式,这可以通过使用链表或数组实现。在链表实现中,每个节点包含一个数据...

    树和二叉树中序和后序顺序遍历二叉树

    1按先序次序输入二叉树中结点的值(一个字符),`0`表示空树,生成二叉树的二叉链表存储结构。然后按中序和后序顺序遍历二叉树输出结果。

    中序遍历二叉树非递归算法

    通常,我们首先通过递归来实现二叉树的遍历,但递归方法可能因深度过大导致栈溢出,因此掌握非递归版本的遍历算法显得尤为重要。 ### 中序遍历二叉树非递归算法详解 #### 1. 理解中序遍历的基本概念 中序遍历是一...

    易语言二叉树遍历

    在“二叉树_取下级树”这个标签中,可能包含了一个获取二叉树子树的函数,用于构建遍历过程。 4. **内存操作**: - "内存_读整数内存"这个标签涉及到对内存的直接操作。在易语言中,可以使用内存操作函数来读取和...

    二叉树遍历--前序遍历

    在压缩包文件`SY0907214_张延超_作业3_二叉树遍历`中,可能包含了具体的二叉树结构和对应的遍历代码实现,你可以详细分析这些代码,理解它们如何根据上述规则进行遍历。通过这种方式,你不仅可以学习到二叉树的基本...

    二叉树的建立及前中后序遍历

    就是一个 简单的 二叉树的建立及前中后序遍历的 代码

    数据结构实验——二叉树的建立和遍历.zip

    2.用递归及非递归算法对二叉树实现先序遍历; 3.用递归及非递归算法对二叉树实现中序遍历; 4.用递归及非递归算法对二叉树实现后序遍历。 5.用递归遍历算法中的访问结点的操作修改为叶结点计数,统计度为0的;度为1...

Global site tag (gtag.js) - Google Analytics