数据结构与算法__08--霍夫曼树二叉树遍历:1.写在节点类中,在上层调用;2.写在主函数中一次性整体完成

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法__08--霍夫曼树二叉树遍历:1.写在节点类中,在上层调用;2.写在主函数中一次性整体完成相关的知识,希望对你有一定的参考价值。

1 霍夫曼树整体的前序遍历

public static void preHufOrder(Node node) 
    if (node != null)  //每次都会先判断当前节点是否为空,造成重复判断,可以在调用该函数时进行判断的方法进行改善
        System.out.println(node);
        if (node.left != null) 
            preHufOrder(node.left);
        
        if (node.right != null) 
            preHufOrder(node.right);
        
     else 
        System.out.println("二叉树为空,无法遍历");
    

2 在节点类创建前序遍历方法,主函数中调用

//在节点类创建前序遍历方法,主函数中调用
 
//主函数中的方法
public static void preOrder(Node root) 
    if (root != null) 
        root.preOrder();
     else 
        System.out.println("二叉树为空,无法遍历");
    
  
 
//节点类中的前序遍历
public void preOrder() 
    System.out.println(this);
    if (this.left != null) 
        this.left.preOrder();
    
    if (this.right != null) 
        this.right.preOrder();
    

3 完整代码

package edu.seu.demo11huffmantree;
 
import java.util.ArrayList;
import java.util.Collections;
 
public class Demo01HuffmanTree 
    public static void main(String[] args) 
        int arr[] = 13, 7, 8, 3, 29, 6, 1;
        Node root = creatHuffmanTree(arr);
//        System.out.println(root);
        preHufOrder(root);
    
 
    //在子节点前序遍历,主函数中调用
/*    public static void preOrder(Node root) 
        if (root != null) 
            root.preOrder();
         else 
            System.out.println("二叉树为空,无法遍历");
        
      */
    //整体的前序遍历
    public static void preHufOrder(Node node) 
        if (node != null)  //每次都会先判断当前节点是否为空,造成重复判断,可以在调用该函数时进行判断的方法进行改善
            System.out.println(node);
            if (node.left != null) 
                preHufOrder(node.left);
            
            if (node.right != null) 
                preHufOrder(node.right);
            
         else 
            System.out.println("二叉树为空,无法遍历");
        
    
 
    /**
     * @param arr 待转换的数组
     * @return 霍夫曼树的根节点
     */
    public static Node creatHuffmanTree(int[] arr) 
        ArrayList<Node> nodes = new ArrayList<>();//创建存取节点的集合
        for (int i : arr) 
            nodes.add(new Node(i));
        
        while (nodes.size() > 1) 
            Collections.sort(nodes);//对集合升序排列
            Node leftNode = nodes.get(0);
            Node rightNode = nodes.get(1);
            Node parent = new Node(leftNode.value + rightNode.value);//以两个最小节点之和创建新节点
            parent.left = leftNode;
            parent.right = rightNode;
            nodes.remove(leftNode);
            nodes.remove(rightNode);
            nodes.add(parent);
        
 
        return nodes.get(0);
    

 
class Node implements Comparable<Node> 
    int value;//节点权值
    Node left;//左节点
    Node right;//指向右节点
 
 
    //前序遍历
/*    public void preOrder() 
        System.out.println(this);
        if (this.left != null) 
            this.left.preOrder();
        
        if (this.right != null) 
            this.right.preOrder();
        
    */
 
    public Node(int value) 
        this.value = value;
    
 
    @Override
    public String toString() 
        return "Node" +
                "value=" + value +
                ;
    
 
    @Override
    public int compareTo(Node o) 
        return this.value - o.value;
    
 

以上是关于数据结构与算法__08--霍夫曼树二叉树遍历:1.写在节点类中,在上层调用;2.写在主函数中一次性整体完成的主要内容,如果未能解决你的问题,请参考以下文章

SDUT-3441_数据结构实验之二叉树二:遍历二叉树

二叉树二叉树基本操作通用接口

数据结构----树二叉树----c++ && python

数据结构-树二叉树的相关算法

数据结构与算法:树 二叉树入门

数据结构_树_图_总结