【典型习题整理】数据结构与算法作业

数据结构与算法


中序线索化二叉树及其遍历

       将树线索化即让它闲置的节点指向中序遍历的下一位,n个节点共有2n个指针,但利用起来的只有n-1个,剩余n+1个中我们可以给其赋值指向中序的下一个节点。

节点类需要

       成员:

  1. 左子树
  2. 右子树
  3. 节点值
  4. Boolean类型变量两个,用于显示左,右子树是否为线索

       方法:

  1. 添加左右子树
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;
	}
}

构建类需要

       成员:

  1. BinaryThreadTree类型的对象
  2. BinaryThreadTree类型的指针,用于指向前一个遍历的节点

       方法:

  1. 线索化
  2. 按线索化遍历
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]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值