根据一个二进制数组,建一个固定的满二叉树,然后根据二叉树的层数,分成几段,例如二叉树有三层,就每两个0,1字符为一组。位数不够补0。还有就是二叉树不是根节点没有0,1代表,每个结点只有编号,即S几。每一段遍历一次二叉树,例如第一段是01,则先S1左孩子,再S2右孩子,假设为S8,则将S8发给接收端,接收端再根据S8,从S0遍历到S8得到01,将信息的所有段整合起来。即除了叶子结点外没有0,1意义。而树的高度是固定的,字符串变成的0,1代码段只能比他短,短的位数补0.请各位帮个忙.因为二叉树不熟悉.
请各位帮忙写一下代码.提示一下.
遍历.查找.建立.....谢谢了.
请各位帮忙写一下代码.提示一下.
遍历.查找.建立.....谢谢了.
解决方案 »
- 一个关于java内存回收的问题
- linux下安装j2sdk-1_4_2_12-linux-i586.bin,出现can't find /usr/bin/sum to do checksum
- JAVA如何将文件夹复制到远端的WINDOWS服务器的某个路径下?
- 如何用JS处理页面的转向?
- 菜鸟问题:读文本区
- 在java开发中 怎样更换标题栏默认的coffe图标
- 急,在线等,请问有没有参加过NIIT软件培训的,本人现在大四想参加软件工程师就业班,有学过的来帮忙说说,马上开班了,
- 请问如何用java实现对串口的操作
- 中文JAVA技术网正式成为共创软件联盟成员网站
- 在大雪纷飞的冬季里,大家献出一点爱心吧!
- 求JAVA 字符串中如何截取字母
- 关于反射的问题。。
然后根据二进制数据的建立一颗满二叉树.
左节点为0.右节点为1. 节点名称:为S开头的.比如根节点为S0.下面的左节点为S1.S1=0;S2=1;
遍历的话:
如果传入S8的话.找出来S8所有的节点的.比如:S0-S1-S3-S8.
找出的二进制值是:000.(S0不用.)
遍历的话:
如果传入S8的话.找出来S8所有的节点的.比如:S0-S1-S3-S8.
找出的二进制值是:001.(S0不用.)
转换成一个二进制数组比如:
String [] arr=new String[]{"01000001","01000010","01000011"};
然后根据上面的数组建立一颗满二叉树.根结点名称为S0.其它节点名称分别为:S1,S2,S3...
左节点的值为:0.右节点的值为1:=====================================================================================
然后根据二叉树的层数,分成几段,例如二叉树有三层,就每两个0,1字符为一组。位数不够补0。还有就是二叉树不是根节点没有0,1代表,每个结点只有编号,即S几。每一段遍历一次二叉树,例如第一段是01,则先S1左孩子,再S2右孩子,假设为S8,则将S8发给接收端,接收端再根据S8,从S0遍历到S8得到01,将信息的所有段整合起来。即除了叶子结点外没有0,1意义。而树的高度是固定的,字符串变成的0,1代码段只能比他短,短的位数补0.=====================================================================================输出:然后根据上面的二进制数据.返回对应的节点.
===============================================================其实要做的就是:
我输入一段英文字符串.然后转换成二进制数组.根据二进制数组生成一颗满二叉树.
然后返回对应的节点.
发送级接收端.然后接收端根据接收到的节点名称.遍历满二叉树.得到二进制数据.
然后转换成英文字符串.
就是利用满二叉树加密与解密字符串.不知道我有没有说明白.
转换成一个二进制数组比如:
String [] arr=new String[]{"01000001","01000010","01000011"};
然后根据上面的数组建立一颗满二叉树.根结点名称为S0.其它节点名称分别为:S1,S2,S3...
左节点的值为:0.右节点的值为1:===============================================================
上面说的A的二制为:"01000001".B为:"01000010".C为:"01000011".
根据arr中的数据建立一颗满二叉树.就是把二进制的值.转换成满二叉树的节点的值.
0为左节点的值.1为右节点的值. 比如:S1为左节点:则它的值为0.S2为右节点:则它的值为1.相当于 S0(根据结节点)
/ \
(value:0)s1 S2(value:1)
/ \ / \
(0)s3 S4(1) (0)s5 S6(1)比如:我有一个01的二进制.遍历得的节点是S4.00的话就是S3S4.我发送给接收端后.再查找满二叉树 得到的二进制值是01
S3.我发送给接收端后.再查找满二叉树 得到的二进制值是00
再把二进制转换成字符.=============================思路是这样子的发送端:输入字符串后.转换成二进制数组.根据二进制数组生成二叉树.
然后遍历得到节点.发送级接收端.
接收端遍历二叉树得到二进制数组.二进制数组转换成字符串.
实现字符串的加密与解密.明文是字符串.密文是二叉树节点名称.
2, "1"
3, "00"
4, "01"
5, "10"
6, "11"
7, "000"
8, "001"
9, "010"
10, "011"
11, "100"
12, "101"
13, "110"
14, "111"
15, "0000"
16, "0001"
17, "0010"
18, "0011"
19, "0100"
20, "0101"上面是节点对应的所有经过的节点的值.
比如:S8: S1(0)-S3(0)-S8(1) 所以对应的值是001比如:我一个字符串转换成二制话.是001.建立一颗满二叉树.根据左节点为0.右节点为1的规则.则路线是 S1(0)-S3(0)-S8(1)
所以返回的值是S8这个节点.我的接收端接收到S8这个节点值.
在去找S8.所对应的节点与相对应的值:S8(1)-S3(0)-S1(0)
所以得到的值是001.
再转换成字符串.只是上面的要求.二进制数组以及分成几段.整合.
不明白.这些东西.也不了解.所以请各位.指点指点.能不能给我相关代码参考.
因为二叉树不了解.自己写.不知道从何下手.
包:mars.security有8个类
BinaryTree.java
Decrypt.java
DecryptHelper.java
Encrypt.java
EncryptHelper.java
EncryptTree.java
Node.java
Tool.java
包:mars.test 测试类
Test.java
private Node binaryTree=null;
public BinaryTree(Node node)
{
binaryTree=node;
} public Node getBinaryTree() {
return binaryTree;
}
public void setBinaryTree(Node binaryTree) {
this.binaryTree = binaryTree;
}
// /**
// *
// * @param list
// * @return
// */
// public static BinaryTree init(LinkedList<Node> list)
// {
// BinaryTree returnValue=null;
//
// if(validateNodeCount(list.size()))
// {
//
// }
//
// return returnValue;
// }
//
// /**
// * 判断结点个数是否有效
// * @param count 结点个数
// * @return true有效/false无效
// *
// */
// public static boolean validateNodeCount(int count)
// {
// boolean returnValue=false;
// for(int i=1;i>0;i++)
// {
// if(getNodeCount(i)==count)
// {
// returnValue=true;
// break;
// }
// }
// return returnValue;
// }
//
// /**
// * 计算结点个数
// * @param layer 层数
// * @return 结点个数
// */
// public static int getNodeCount(int layer)
// {
// int returnValue=0;
//
// if(layer<=0)
// {
// returnValue=0;
// }
//
// if(layer>0)
// {
// returnValue=(int)Math.pow(2,layer-1)+getNodeCount(layer-1);
//
// }
// return returnValue;
// }
}
public class Decrypt {
/**
* 根据密码二进制流获取明文二进制流
*/
public static String getTextBits(String digits) throws Exception
{
String returnValue="";
if(digits.length()%4!=0)
{
throw new Exception();
}
for(int i=0;i<=digits.length()-4;i+=4)
{
try {
int index=DecryptHelper.getDigit(digits.substring(i, i+4))-1;
returnValue+=EncryptTree.DigitValue.get(index);
} catch (Exception e) {
e.printStackTrace();
}
}
return returnValue;
}
/**
*
* @param textBits 调用getTextBits(digit)的返回结果
* @return
* @throws Exception
*/
public static String getText(String textBits) throws Exception
{
String returnValue="";
if(textBits.length()%8!=0)
{
throw new Exception();
}
String temp="";
for(int i=0;i<=textBits.length()-8;i+=8)
{
temp=textBits.substring(i,i+8);
returnValue+=String.valueOf(Tool.convert(temp));
}
return returnValue;
}
}
//-----------------------------------------------------------------------
package mars.security;public class DecryptHelper {
/**
* 四位二进制转换为数字
* @param fourBits
* @return
* @throws Exception
*/
public static int getDigit(String fourBits) throws Exception
{
int returnValue=-1;
for(int i=0;i<EncryptHelper.BinaryDigit.length;i++)
{
if(EncryptHelper.BinaryDigit[i].compareTo(fourBits)==0)
{
returnValue=i;
break;
}
}
if(returnValue==-1)
{
throw new Exception();
}
return returnValue;
}
}
//-----------------------------------------------------------------------
package mars.security;public class Encrypt {
public static String getCipherText(String input) throws Exception
{
String returnValue="";
String cipher=convertToDigits(EncryptHelper.convert(input));
char[] chars=cipher.toCharArray();
int i=0;
while(i<chars.length)
{
returnValue+=EncryptHelper.BinaryDigit[java.lang.Integer.valueOf(String.valueOf((chars[i++])))];
}
return returnValue;
}
/**
* 加密数字序列结果
* @param bits
* @return
*/
public static String convertToDigits(String bits)
{
String returnValue="";
int i=0;
boolean flag=true;
char[] chars=bits.toCharArray();
Node temp=EncryptTree.Instance.getTree().getBinaryTree();
while(i<chars.length)
{
if(chars[i]=='0')//='0'
{
if(temp.getLeft()!=null)
{
flag=false;
temp=temp.getLeft();
}
else
{
flag=true;
}
}
else //='1'
{
if(temp.getRight()!=null)
{
flag=false;
temp=temp.getRight();
}
else
{
flag=true;
}
} if(flag) //flag==true 从当前开始计算
{
returnValue+=temp.getId();
temp=EncryptTree.Instance.getTree().getBinaryTree();
}
else//flag==false 继续计算
{
i++;
}
}
returnValue+=temp.getId();//补足最后一位计算结果
return returnValue;
}
}
//-----------------------------------------------------------------------
* @param args
*/
public static void main(String[] args) { try
{
System.out.println(Encrypt.getCipherText("abc"));
System.out.println(Encrypt.convertToDigits("100110101001"));
System.out.println(Decrypt.getText(
Decrypt.getTextBits("01010110010010000011011001110111011001110011")));
}
catch(Exception ex)
{
}
}}
import java.util.regex.*;public class Tool {
public enum ValidateType
{
WORDS,//[a-zA-Z_0-9]
CHARS,//[a-zA-Z]
CHAR_OR_DIGIT//[a-zA-Z0-9];
}
/**
* 将byte转化为二进制序列
* @param b
* @return
*/
public static String convert(byte b)
{
String returnValue="";
while(b!=0)
{
returnValue=String.valueOf(b%2)+returnValue;
b/=2;
}
while(returnValue.length()<8)
{
returnValue="0"+returnValue;
}
return returnValue;
}
/**
* 将二进制字符串转化为byte
* @param bits
* @return
*/
public static char convert(String bits) throws Exception
{
char c=0;
if(bits.length()%8!=0)
{
throw new Exception();
}
c=(char)Integer.parseInt(bits, 2);
return c;
}
/**
* 判断待加密的字符串是否合法
* @param type 验证类型
* @param input 待加密的字符串
* @return true/false 合法 /不合法
*/
public static boolean validateChars(ValidateType type,String input)
{
String validateString=null;
switch(type)
{
case WORDS:
validateString="^\\w+$";
break;
case CHARS:
validateString="^[a-zA-Z]+$";
break;
case CHAR_OR_DIGIT:
validateString="^[a-zA-Z0-9]+$";
break;
}
Pattern pattern= Pattern.compile(validateString);
Matcher matcher=pattern.matcher(input);
return matcher.matches();
}
}
private int id;//这个节点ID不需要的,为了加密速度,特意加这个id
private char data; //0|1|R根结点
private Node left=null;
private Node right=null;
public Node(int id,char data)
{
this.id=id;
this.data=data;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getData() {
return data;
}
public void setData(char data) {
this.data = data;
}
public Node getLeft() {
return left;
}
public void setLeft(Node left) {
this.left = left;
}
public Node getRight() {
return right;
}
public void setRight(Node right) {
this.right = right;
}
}
private BinaryTree tree=null;
/*
* 用于密钥初始化后,数字对应的二进制流的计算
*/
public static LinkedList<String> DigitValue=new LinkedList<String>();
public static EncryptTree Instance=new EncryptTree();
private EncryptTree()
{
if(tree==null)
{
DigitValue.add("");//0
DigitValue.add("");//1
DigitValue.add("");//2
DigitValue.add("");//3
DigitValue.add("");//4
DigitValue.add("");//5
DigitValue.add("");//6
DigitValue.add("");//7
DigitValue.add("");//8
DigitValue.add("");//9
/*
* 这里相当于密钥的初始化,当改变这个树时,加密后的密文就会不同
* */
Node n1=new Node(1,'R');
Node n2=new Node(2,'0');
Node n3=new Node(3,'1');
Node n4=new Node(4,'0');
Node n5=new Node(5,'1');
Node n6=new Node(6,'0');
Node n7=new Node(7,'1');
Node n8=new Node(8,'0');
Node n9=new Node(9,'1');
n1.setLeft(n2);
n1.setRight(n3);
n2.setLeft(n4);
n2.setRight(n5);
n3.setLeft(n6);
n4.setRight(n7);
n5.setLeft(n8);
n6.setRight(n9);
tree=new BinaryTree(n1);
computeDigitValue(n1);
}
}
public BinaryTree getTree() {
return tree;
}
public void computeDigitValue(Node node)
{
if(node.getLeft()!=null)
{
DigitValue.set(node.getLeft().getId()-1,DigitValue.get(node.getId()-1)+"0");
computeDigitValue(node.getLeft());
}
if(node.getRight()!=null)
{
DigitValue.set(node.getRight().getId()-1,DigitValue.get(node.getId()-1)+"1");
computeDigitValue(node.getRight());
}
}
}
/*
* 密文二进制数组
*/
public static String[] BinaryDigit=new String[]{
"0000",
"0001",
"0010",
"0011",
"0100",
"0101",
"0110",
"0111",
"1000",
"1001"
};
/**
* 将加密完成的数字序列转化为二进制字符串
* @param digits
* @return
* @throws Exception 当录入的数字序列不合法时,会出现转换出错,但是由于是直接调用,不会出现异常情况
*/
public static String convertToCipher(String digits) throws Exception
{
String returnValue="";
char[] chars=digits.toCharArray();
int i=0;
while(i<chars.length)
{
returnValue+=EncryptHelper.BinaryDigit[java.lang.Integer.valueOf(String.valueOf((chars[i++])))];
}
return returnValue;
}
/**
* 按照ASCII编码把input转换成bytes数组
* @param input
* @return
* @throws Exception
*/
public static String convert(ValidateType type,String input) throws Exception
{
String returnValue="";
if(!Tool.validateChars(type,input))
{
throw new Exception("加密字符串不合法!");
}
byte[] bytes=input.getBytes(Charset.forName("ASCII"));
int i=0;
while(i<bytes.length)
{
returnValue+=Tool.convert(bytes[i]);
i++;
}
return returnValue;
}
public static String convert(String input) throws Exception
{
return convert(ValidateType.WORDS,input);
}
}
import java.util.Scanner;public class Tree {
static Node root = null; enum Direcation {
right, left
} public static int getInt() {
return Integer.parseInt(new Scanner(System.in).next().trim());
} public static void main(String[] args) {
while (true) {
System.out.println("1.增加 2.中序 3.删除 ");
int = getInt();
switch () {
case 1:
System.out.println("输入节点值");
builderTree(getInt());
break;
case 2:
query(root);
break;
case 3:
System.out.println("输入节点值");
delete(getInt());
break;
case 4:
System.exit(0);
}
}
} public static void builderTree(int i) {
if (root == null) {
root = new Node(i);
return;
}
Node tempRood = root;
while (true) {
if (tempRood.getI() > i) {
if (tempRood.getLeft() != null) {
tempRood = tempRood.getLeft();
} else {
tempRood.setLeft(new Node(i));
break;
}
} else {
if (tempRood.getRight() != null) {
tempRood = tempRood.getRight();
} else {
tempRood.setRight(new Node(i));
break;
}
}
}
} public static void query(Node root) {
if (root != null) {
if (root.getLeft() != null) {
query(root.getLeft());
}
System.out.println(root.getI());
if (root.getRight() != null) {
query(root.getRight());
}
}
} public static void delete(int i) {
if (root != null) {
if (root.getI() == i) {
root = null;
return;
}
Node temp = root;
Node farter = temp;
Direcation dir = null;
while (true) {
if (temp.getI() == i) {
execute(farter, temp, dir);
break;
} else if (temp.getI() > i) {
if (temp.getLeft() == null) {
return;
}
farter = temp;
temp = temp.getLeft();
dir = Direcation.left;
} else if (temp.getI() < i) {
if (temp.getRight() == null) {
return;
}
farter = temp;
temp = temp.getRight();
dir = Direcation.right;
}
}
}
} public static void execute(Node fater, Node son, Direcation dir) {// 删除
if (son.getLeft() == null && son.getRight() == null) {
if (dir == Direcation.left) {
fater.setLeft(null);
} else if (dir == Direcation.right) {
fater.setRight(null);
}
} else if (son.getLeft() != null && son.getRight() == null) {
if (dir == Direcation.left) {
fater.setLeft(son.getLeft());
} else if (dir == Direcation.right) {
fater.setRight(son.getLeft());
}
son.setLeft(null); } else if (son.getLeft() == null && son.getRight() != null) {
if (dir == Direcation.left) {
fater.setLeft(son.getRight());
} else if (dir == Direcation.right) {
fater.setRight(son.getRight());
}
son.setRight(null); } else if (son.getLeft() != null && son.getRight() != null) {
Node unfater = son;
Node unRight = son.getLeft();
while(unRight.getRight()!=null){
unfater = unRight;
unRight = unRight.getRight();
}
if (unfater == son) {
unfater.setLeft(null);
unRight.setRight(son.getRight());
son.setRight(null);
son.setLeft(null);
} else {
unfater.setRight(unRight.getLeft());
unRight.setLeft(son.getLeft());
unRight.setRight(son.getRight());
son.setRight(null);
son.setLeft(null);
}
if (dir == Direcation.left) {
fater.setLeft(unRight);
} else if (dir == Direcation.right) {
fater.setRight(unRight);
}
}
}
}class Node {
private Integer i;
private Node right;
private Node left; public Node getRight() {
return right;
} public void setRight(Node right) {
this.right = right;
} public Node getLeft() {
return left;
} public void setLeft(Node left) {
this.left = left;
} public Node(Integer i) {
this.i = i;
} public Integer getI() {
return i;
}
}