数据结构与算法__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.写在主函数中一次性整体完成的主要内容,如果未能解决你的问题,请参考以下文章