您的位置:首页 > 其它

二叉树与哈夫曼树

2015-11-15 17:20 344 查看
1,二叉树

二叉树可以分为:完全二叉树,满二叉树,哈夫曼树;

二叉树的遍历:(递归)先序,中序,后序遍历;

二叉树的结构:根节点,左子树,右子树;

二叉树的性质:

(1). 如果二叉树的节点个数为n,则父节点的个数为n/2;

(2).若2i+1<n.则i的左孩子的节点序号为2i+1;或者i无孩子;

(3).若2i+2<n,则i的右孩子的节点序号为2i+2;或者i无孩子;

二叉树的构建:

// 构建二叉树
public void createTreeNode() {
// 把数据构成一个节点
for (int i = 0; i < value.length; i++) {
TreeNode node = new TreeNode(value[i]);
// 依次添加到队列里
list.add(node);
}
// 遍历队列,取出节点,生成二叉树的叶子;
for (int i = 0; i < list.size() / 2; i++) {
TreeNode fatherNode = list.get(i);
TreeNode Left = list.get(2 * i + 1);
// 生成左子树
fatherNode.setLeftNode(Left);
// 判断是否有右子树,生成右子树
if ((2 * i + 2) < list.size()) {
TreeNode Right = list.get(2 * i + 2);
fatherNode.setRightNode(Right);
}
}
}

二叉树的遍历方式:(递归算法);

// 先序遍历
public void Pre(TreeNode root) {
// 拿到根节点
System.out.print(root.getData());
// 递归方式访问,拿到左子树
TreeNode left = root.getLeftNode();
if (left != null) {
Pre(left);
}
// 再拿到右子树
TreeNode right = root.getRightNode();
if (right != null) {
Pre(right);
}
}

// 中序遍历
public void Center(TreeNode root) {
// 拿到左子树,递归调用
TreeNode left = root.getLeftNode();
if (left != null) {
Center(left);
}
// 再访问跟节点
System.out.print(root.getData());
// 最后,拿到右子树
TreeNode right = root.getRightNode();
if (right != null) {
Center(right);
}

}

// 后序遍历
public void Last(TreeNode root) {
// 拿到左子树
if (root != null) {
TreeNode left = root.getLeftNode();
if (left != null) {
Center(left);
}
// 拿到右子树
TreeNode right = root.getRightNode();
if (right != null) {
Last(right);
}
// 最后,访问跟节点
System.out.print(root.getData());
}

}

2.哈夫曼树

(1)哈夫曼的性质:找出对应带权路径(WPL)最小的值是最优二叉树

(2)哈夫曼编码:左子树为0,右子树为1,从树的节点到分节点的路径长度串起来的每个值;

(3) 构建哈夫曼树

public class HfMTree {
LinkedList<HfmNode> list = new LinkedList<HfmNode>();
public int[] value = { 1, 7, 2, 4, 6, 3, 8 };

public static void main(String[] args) {

HfMTree test = new HfMTree();
test.createHfm();
}

// 构建哈弗曼树
public void createHfm() {
// 把数组的节点值构成森林
for (int i = 0; i < value.length; i++) {
HfmNode node = new HfmNode(value[i]);
list.add(getIndex(value[i]), node);

}
// 打印出排序后的值
// for (int i = 0; i < list.size(); i++) {
// System.out.println(list.get(i).getData());
// }

// 构建哈夫曼树
while (list.size() > 1) {
HfmNode hfmFrist = list.removeFirst();
HfmNode hfmSecend = list.removeFirst();
// 哈夫曼的值是左右节点的和
HfmNode newNode = new HfmNode(hfmFrist.getData()
+ hfmSecend.getData());
newNode.setLeft(hfmFrist);
newNode.setRight(hfmSecend);
// 按照指定的索引位置插入新的节点
list.add(getIndex(newNode.getData()), newNode);
}

hfmCode(list.getFirst(), "");
}

// 构建哈夫曼编码
private void hfmCode(HfmNode root, String code) {
if (root.getLeft() != null) {
hfmCode(root.getLeft(), code + "0");
}
if (root.getRight() != null) {
hfmCode(root.getRight(), code + "1");
}
if (root.getLeft() == null && root.getRight() == null) {
System.out.println(root.getData() + "的编码:" + code);
// System.out.println(code);

}
// return code;
}

/**
* 定义索引下标的value值
*/
// 该函数将返回一个插入的索引
private int getIndex(int value) {
for (int i = 0; i < list.size(); i++) {
HfmNode node = list.get(i);
// 判断当前值是否比队列的值大,否则return;
if (node.getData() > value) {
return i;
}

}

return list.size();
}

}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: