数据结构与算法
中序线索化二叉树及其遍历
将树线索化即让它闲置的节点指向中序遍历的下一位,n个节点共有2n个指针,但利用起来的只有n-1个,剩余n+1个中我们可以给其赋值指向中序的下一个节点。
节点类需要
成员:
- 左子树
- 右子树
- 节点值
- Boolean类型变量两个,用于显示左,右子树是否为线索
方法:
- 添加左右子树
package TenWeek;
import java.util.*;
public class BinaryThreadTree {
public BinaryThreadTree left;
public boolean isLeftThread;
public BinaryThreadTree right;
public boolean isRightThread;
public Object value;
public BinaryThreadTree(){}
public BinaryThreadTree(Object x){this.value=x;}
public void addLeft(Object x){this.left=new BinaryThreadTree(x);}
public void addRight(Object x){this.right=new BinaryThreadTree(x);}
public void visit(BinaryThreadTree p){System.out.print(p.value+", ");}
public void levTravel(BinaryThreadTree p){
if(p==null) return;
Queue<BinaryThreadTree> q=new LinkedList<BinaryThreadTree>();
q.offer(p);
BinaryThreadTree node;
while(!q.isEmpty()){
node=q.poll();
visit(node);
if(node.left!=null) q.offer(node.left);
if(node.right!=null) q.offer(node.right);
}
System.out.println();
}
/*
这个方法用于根据先序遍历字符串构建树,其中,先序遍历样式为“ABD##E#G##CF###”
表示A左子节点为B,B,左子节点为D,D为叶子节点······
*/
private static int static_i=0;
public BinaryThreadTree getTreeFromString(String s){
if(s.length()==0||s.equals("")) return null;
BinaryThreadTree curnode=null;
if(s.charAt(static_i)!='#'){
curnode=new BinaryThreadTree(s.charAt(static_i));
static_i++;
curnode.left=getTreeFromString(s);
curnode.right=getTreeFromString(s);
}
else static_i++;
return curnode;
}
/*
* 用于判断树是否为完全二叉树
*/
public boolean isPerfect(BinaryThreadTree p){
if(p==null) return true;
BinaryThreadTree Left=null;
BinaryThreadTree Right=null;
BinaryThreadTree curnode;
boolean isLeaf=false;
Queue<BinaryThreadTree> q=new LinkedList<BinaryThreadTree>();
q.offer(p);
while(!q.isEmpty()){
curnode=q.poll();
Left=curnode.left;
Right=curnode.right;
if((Left==null&&Right!=null)||(isLeaf&&(Left!=null||Right!=null))) return false;
if(Left!=null) q.offer(Left);
if(Right!=null) q.offer(Right);
else isLeaf=true;
}
return true;
}
}
构建类需要
成员:
- BinaryThreadTree类型的对象
- BinaryThreadTree类型的指针,用于指向前一个遍历的节点
方法:
- 线索化
- 按线索化遍历
package TenWeek;
public class BinaryThreadTree_Thread {
public static BinaryThreadTree pre;
public static void inThread(BinaryThreadTree node){
if(node==null) return;
inThread(node.left);
if(node.left==null){
node.isLeftThread=true;
node.left=pre;
}
if(pre!=null&&pre.right==null){
pre.isRightThread=true;
pre.right=node;
}
pre=node;
inThread(node.right);
}
public static void visit(BinaryThreadTree p){System.out.print(p.value+", ");}
public static void midTravel_inThread(BinaryThreadTree p){
if(p==null) return;
while(p!=null&&(!p.isLeftThread)) p=p.left;
while(p!=null){
visit(p);
if(p.isRightThread) p=p.right;
else{
p=p.right;
while(p!=null&&(!p.isLeftThread)) p=p.left;
}
}
}
public static void main(String args[]) throws Exception{
BinaryThreadTree root = new BinaryThreadTree("A");
root=root.getTreeFromString("ABD##E#G##CF###");
System.out.println("isPerfect : "+root.isPerfect(root));
System.out.println();
inThread(root);
System.out.println("MidTravel : ");
midTravel_inThread(root);
}
}
结果如下:
isPerfect : false
MidTravel :
D, B, E, G, A, F, C,
霍夫曼树
定义
霍夫曼树。
实现
huffman节点类
package TenWeek;
import java.util.*;
public class HuffmanNode {
public Object value;
public int weight;//权重
HuffmanNode left;
HuffmanNode right;
public HuffmanNode(Object x, int weight){
this.value=x;
this.weight=weight;
}
public String toString(){
return "Node[vale=" + this.value + ", weight=" + this.weight + "]";
}
public boolean has(HuffmanNode p, Object x){
if(p==null) return false;
if(p.value==x) return true;
Queue<HuffmanNode> q=new LinkedList<HuffmanNode>();
q.offer(p);
HuffmanNode temp;
while(!q.isEmpty()){
temp=q.poll();
if(temp.value==x) return true;
if(temp.left!=null) q.offer(temp.left);
if(temp.right!=null) q.offer(temp.right);
}
return false;
}
public boolean isPerfect(HuffmanNode p){
if(p==null) return true;
HuffmanNode left;
HuffmanNode right;
HuffmanNode curnode;
boolean leaf=false;
Queue<HuffmanNode> q=new LinkedList<HuffmanNode>();
q.offer(p);
while(!q.isEmpty()){
curnode=q.poll();
left=curnode.left;
right=curnode.right;
if((left==null&&right!=null)||(leaf)&&(left!=null||right!=null)) return false;
if(left!=null) q.offer(left);
if(right!=null) q.offer(right);
else leaf=true;
}
return true;
}
}
Huffman功能实现
package TenWeek;
import java.util.*;
public class HuffmanTree {
public HuffmanNode node;
public HuffmanNode creatHuffmanTree(List<HuffmanNode> nodes){
while(nodes.size()>1){
//Collections.sort((List<T>) nodes);
sort(nodes);
//权值从大到小
HuffmanNode Left=nodes.remove(nodes.size()-1);
HuffmanNode Right=nodes.remove(nodes.size()-1);
HuffmanNode Parent=new HuffmanNode(null, Left.weight+Right.weight);
Parent.left=Left;
Parent.right=Right;
nodes.add(Parent);
}
return nodes.get(0);
}
public void levTravel(HuffmanNode p){
if(p==null) return;
Queue<HuffmanNode> q=new LinkedList<HuffmanNode>();
HuffmanNode temp;
q.offer(p);
while(!q.isEmpty()){
temp=q.poll();
if(temp==null) continue;
System.out.print(temp.toString()+"\n");
if(temp.left!=null) q.offer(temp.left);
if(temp.right!=null) q.offer(temp.right);
}
System.out.println();
}
public String getBinary(HuffmanNode root, Object x, String s){
if(root==null) return s;
if(root.value==x) return s;
if(root.left.has(root.left, x)) return getBinary(root.left, x, s+"0");
if(root.right.has(root.right, x)) return getBinary(root.right, x, s+"1");
else return "Sorry, we never find what you want.";
}
public void sort(List<HuffmanNode> nodes) {
// TODO Auto-generated method stub
for(int i=0;i<nodes.size()-1;i++)
for(int j=0;j<nodes.size()-1;j++)
if(nodes.get(j).weight<=nodes.get(j+1).weight)//注:是<=因为需要保证新合成的节点在与固有节点权重相同时max(I)最短
swap(nodes, j);
}
private void swap(List<HuffmanNode> nodes, int j) {
// TODO Auto-generated method stub
HuffmanNode temp=nodes.remove(j);
nodes.add(j+1, temp);
}
}
Huffman检验
package TenWeek;
import java.util.*;
public class HuffmanTree_test {
public static void main(String args[]){
HuffmanTree t=new HuffmanTree();
//test01
List<HuffmanNode> L=new LinkedList<HuffmanNode>();
HuffmanNode a=new HuffmanNode("a", 7);
HuffmanNode b=new HuffmanNode("b", 8);
HuffmanNode c=new HuffmanNode("c", 9);
HuffmanNode d=new HuffmanNode("d", 15);
L.add(a);
L.add(b);
L.add(c);
L.add(d);
HuffmanNode res01=t.creatHuffmanTree(L);
System.out.println(res01.isPerfect(res01));
t.levTravel(res01);
//test02
List<HuffmanNode> M=new LinkedList<HuffmanNode>();
HuffmanNode a1=new HuffmanNode("m", 10);
HuffmanNode b1=new HuffmanNode("s", 29);
HuffmanNode c1=new HuffmanNode("t", 4);
HuffmanNode d1=new HuffmanNode("a", 8);
HuffmanNode e1=new HuffmanNode("q", 15);
HuffmanNode f1=new HuffmanNode("k", 7);
M.add(a1);
M.add(b1);
M.add(c1);
M.add(d1);
M.add(e1);
M.add(f1);
HuffmanNode res02=t.creatHuffmanTree(M);
System.out.println(res02.isPerfect(res02));
System.out.println("m: "+t.getBinary(res02, "m", ""));
System.out.println("s: "+t.getBinary(res02, "s", ""));
System.out.println("t: "+t.getBinary(res02, "t", ""));
System.out.println("a: "+t.getBinary(res02, "a", ""));
System.out.println("q: "+t.getBinary(res02, "q", ""));
System.out.println("k: "+t.getBinary(res02, "k", ""));
t.levTravel(res02);
//test03
List<HuffmanNode> N=new LinkedList<HuffmanNode>();
HuffmanNode a2=new HuffmanNode("a", 15);
HuffmanNode b2=new HuffmanNode("b", 3);
HuffmanNode c2=new HuffmanNode("c", 14);
HuffmanNode d2=new HuffmanNode("d", 2);
HuffmanNode e2=new HuffmanNode("e", 6);
HuffmanNode f2=new HuffmanNode("f", 9);
HuffmanNode g2=new HuffmanNode("g", 16);
HuffmanNode h2=new HuffmanNode("h", 17);
N.add(a2);
N.add(b2);
N.add(c2);
N.add(d2);
N.add(e2);
N.add(f2);
N.add(g2);
N.add(h2);
HuffmanNode res03=t.creatHuffmanTree(N);
t.levTravel(res03);
//test04
List<HuffmanNode> O=new LinkedList<HuffmanNode>();
HuffmanNode i1=new HuffmanNode("i1", 5);
HuffmanNode i2=new HuffmanNode("i2", 25);
HuffmanNode i3=new HuffmanNode("i3", 3);
HuffmanNode i4=new HuffmanNode("i4", 6);
HuffmanNode i5=new HuffmanNode("i5", 10);
HuffmanNode i6=new HuffmanNode("i6", 11);
HuffmanNode i7=new HuffmanNode("i7", 36);
HuffmanNode i8=new HuffmanNode("i8", 4);
O.add(i1);
O.add(i2);
O.add(i3);
O.add(i4);
O.add(i5);
O.add(i6);
O.add(i7);
O.add(i8);
HuffmanNode res04=t.creatHuffmanTree(O);
System.out.println("i1: "+t.getBinary(res04, "i1", ""));
System.out.println("i2: "+t.getBinary(res04, "i2", ""));
System.out.println("i3: "+t.getBinary(res04, "i3", ""));
System.out.println("i4: "+t.getBinary(res04, "i4", ""));
System.out.println("i5: "+t.getBinary(res04, "i5", ""));
System.out.println("i6: "+t.getBinary(res04, "i6", ""));
System.out.println("i7: "+t.getBinary(res04, "i7", ""));
System.out.println("i8: "+t.getBinary(res04, "i8", ""));
t.levTravel(res04);
}
}
结果如下:
true
Node[vale=null, weight=39]
Node[vale=null, weight=15]
Node[vale=null, weight=24]
Node[vale=a, weight=7]
Node[vale=b, weight=8]
Node[vale=c, weight=9]
Node[vale=d, weight=15]
false
m: 101
s: 0
t: 1100
a: 100
q: 111
k: 1101
Node[vale=null, weight=73]
Node[vale=s, weight=29]
Node[vale=null, weight=44]
Node[vale=null, weight=18]
Node[vale=null, weight=26]
Node[vale=a, weight=8]
Node[vale=m, weight=10]
Node[vale=null, weight=11]
Node[vale=q, weight=15]
Node[vale=t, weight=4]
Node[vale=k, weight=7]
Node[vale=null, weight=82]
Node[vale=null, weight=33]
Node[vale=null, weight=49]
Node[vale=g, weight=16]
Node[vale=h, weight=17]
Node[vale=null, weight=20]
Node[vale=null, weight=29]
Node[vale=f, weight=9]
Node[vale=null, weight=11]
Node[vale=c, weight=14]
Node[vale=a, weight=15]
Node[vale=null, weight=5]
Node[vale=e, weight=6]
Node[vale=d, weight=2]
Node[vale=b, weight=3]
i1: 0110
i2: 10
i3: 0000
i4: 0111
i5: 001
i6: 010
i7: 11
i8: 0001
Node[vale=null, weight=100]
Node[vale=null, weight=39]
Node[vale=null, weight=61]
Node[vale=null, weight=17]
Node[vale=null, weight=22]
Node[vale=i2, weight=25]
Node[vale=i7, weight=36]
Node[vale=null, weight=7]
Node[vale=i5, weight=10]
Node[vale=i6, weight=11]
Node[vale=null, weight=11]
Node[vale=i3, weight=3]
Node[vale=i8, weight=4]
Node[vale=i1, weight=5]
Node[vale=i4, weight=6]