`
huhu_long
  • 浏览: 73521 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论
阅读更多
二叉树 - 所有节点的度都不大于2的树。

存储结构 - 顺序和链式
对于顺序存储结构, 当二叉树为完全二叉树的时候才能够不浪费存储空间, 否则对空间的浪费是很大滴。

而对于链式存储结构, 分三域节点和四域节点
三域 - Data + lChild + rChild
四域 - Data + lChild + parent + rChild

----------------------------- 我是分割线 ----------------------------

二叉树的基本操作:
先序, 中序 和 后序遍历

先定义node
public class Node {
	private String value;
	private Node parent;
	private Node leftChild;
	private Node rightChild;

	public Node(String value, Node parent, Node leftChild, Node rightChild) {
		this.value = value;
		this.parent = parent;
		this.leftChild = leftChild;
		this.rightChild = rightChild;
	}

	public String getValue() {
		return value;
	}

	public Node getParent() {
		return this.parent;
	}

	public Node getLeftChild() {
		return this.leftChild;
	}

	public Node getRightChild() {
		return this.rightChild;
	}
}


再来看遍历
public class Tree {
	
	//       a
	//      / \
	//     b   c
	//    / \   \
	//   d   e   g
	
	public static void main(String[] args) {
		Node d = new Node("d", null, null, null);
		Node e = new Node("e", null, null, null);
		Node g = new Node("g", null, null, null);

		Node b = new Node("b", null, d, e);
		Node c = new Node("c", null, null, g);

		Node a = new Node("a", null, b, c);
		
		printDataLR(a);
		System.out.println();
		printLeftDR(a);
		System.out.println();
		printLRightD(a);
	}
	
	// 先序遍历 a-b-d-e-c-g
	private static void printDataLR(Node root) {
		if (root == null)
			return;
		System.out.print(root.getValue());
		printDataLR(root.getLeftChild());
		printDataLR(root.getRightChild());
	}

	// 中序遍历 d-e-b-g-c-a
	private static void printLeftDR(Node root){
		if (root == null)
			return;
		printLeftDR(root.getLeftChild());
		System.out.print(root.getValue());
		printLeftDR(root.getRightChild());
	}

	// 后序遍历 d-e-b-g-c-a
	private static void printLRightD(Node root){
		if (root == null)
			return;
		printLRightD(root.getLeftChild());
		printLRightD(root.getRightChild());
		System.out.print(root.getValue());
	}
}


----------------------------- 我是分割线 ----------------------------

Huffman树

先看个例子:
//               X
//            0/   \1
//            X      X
//          0/ \1 0/  \1
//          a   b c    d

//      a = 00; b = 01; c = 10; d = 11.


所以假如给定一个字串: aabdca, 则其对应的二进制编码为: 000001111000
而对其解码就是从根结点出发, 扫描二进制编码, 0往左, 1往右, 碰到叶子节点直接输出, 然后重新回到跟结点。所输出来的就是原始字串了。

再来看看Huffman树的定义:
由n个带权叶子结点构成的所有二叉树中带权路径长度最小的二叉树, 又叫最优二叉树。
什么生权? 权就是赋予结点某种特殊意义的正数。
带权路径则是: Sum(结点的权 × 结点到根的路径长度)

一个Huffman树的构造过程如下:
// 权值 {5, 9, 11, 32, 10, 21, 6}

// 第一步
       11    9   11   32   10   21
      / \
     5   6

// 第二步
       11    19   11   32    21
      / \    / \
     5   6  9  10 

// 第三步
       22    19   32    21
      / \    / \
     11  11 9  10
    / \ 
   5  6 

// 第四步
      22      40     32
     / \     / \ 
   11  11   19  21 
   / \     / \
  5  6    9  10

// 第五步
        54            40
       / \            / \
      22  32        19  21
	   / \            / \
   11  11          9  10 
   / \     
  5  6     

// 第六步
            94
          /   \ 
       54      40
      / \      / \
     22 (32) (19)(21)
    / \      / \
   11 (11) (9) (10) 
   / \     
 (5) (6)   

分享到:
评论

相关推荐

    二叉树深度_二叉树查询_二叉树深度_

    二叉树是一种在计算机科学中广泛应用的数据结构,它由节点(也称为结点)组成,每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树的深度是指从根节点到最远叶节点的最长路径上边的数目,即树的最大层数...

    二叉树演示 实现二叉树图形显示

    二叉树是一种特殊的树结构,每个节点最多只有两个子节点,通常分为左子节点和右子节点。在计算机科学中,二叉树被广泛应用于数据的组织和操作,如搜索、排序、文件系统等。本例子关注的是如何实现二叉树的图形显示,...

    根据后序二叉树序列构造二叉树_扩展二叉树

    在计算机科学领域,二叉树是一种基础的数据结构,它由结点构成,每个结点最多有两个子节点,分别称为左子节点和右子节点。在众多的二叉树操作中,根据后序遍历序列(也称为后序序列)来构造二叉树是一项常见的任务。...

    二叉树建立 二叉树基本算法的实现

    (2)先序、中序、后序遍历二叉树:递归算法。 (3)中序遍历二叉树:非递归算法(最好也能实现先序,后序非递归算法)。 (4)求二叉树的高度 。 (5)求二叉树的叶子个数。 (6)对于树中每一个元素值为x的结点...

    第六章 树和二叉树作业及答案(100分).docx

    - **答案解析**:如果一棵二叉树的中序遍历序列和后序遍历序列正好相反,那么该二叉树一定是任一结点都没有左孩子的二叉树。 #### 5. 二叉树的结点数范围 - **答案解析**:深度为k的二叉树最多有\(2^k - 1\)个结点...

    将满二叉树转化为求和二叉树_二叉树_

    在IT领域,特别是数据结构和算法的学习中,二叉树是一种重要的抽象数据类型。满二叉树是一种特殊的二叉树,其中每一层都是完全填充的,除了可能的最后一层,且最后一层的所有节点都尽可能地向左靠拢。而将满二叉树...

Global site tag (gtag.js) - Google Analytics