树节点
public class Node {
int data;
Node left;
Node right;
public int getData() {
return data;
}
public void setData(int 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;
}
}
树
public class Binary_Tree {
Node root;
public Node getRoot() {
return root;
}
public void setRoot(Node root) {
this.root = root;
}
public void createTree(List<Integer> dataList){
System.out.println("创建树开始。。。");
for( Integer i :dataList){
insertNode2(i);
}
System.out.println("创建树结束。。。");
}
public Node buildTree2(int[]preorder,int begin1,int end1,int[] inorder,int begin2,int end2){
Node r = new Node();
r.data= preorder[begin1];
int RID=0;
for(int i=begin2;i<=end2;++i){
if(inorder[i]==r.data){
RID=i;
break;
}
}
if(RID!=begin2){
r.left = buildTree2(preorder,begin1+1,begin1+RID-begin2,inorder,begin2,RID-1);
}
if(RID!=end2){
r.right = buildTree2(preorder,begin1+RID-begin2+1,end1,inorder,RID+1,end2);
}
return r;
}
public void insertNode(int data){
Node newNode = new Node();
newNode.setData(data);
if (this.root == null){
this.root = newNode;
}else {
Node current = this.root;
Node parent;
while (true){
parent = current;
if (data<current.getData()){
current = current.getLeft();
if (current == null){
parent.setLeft(newNode);
break;
}
}else if (data > current.getData()){
current = current.getRight();
if (current == null){
parent.setRight(newNode);
break;
}
}else {
break;
}
}
}
}
public void insertNode2(int data){
if (this.root==null){
this.root = new Node();
this.root.setData(data);
}else {
Node newNode = new Node();
newNode.setData(data);
Node item = this.root;
Node parent = null;
while (item != null){
if (item.getData() == data){
parent = null;
break;
}else if (data>item.getData()){
parent = item;
item = item.getRight();
}else {
parent = item;
item= item.getLeft();
}
}
if (parent != null){
if (data>parent.getData()){
parent.setRight(newNode);
}else {
parent.setLeft(newNode);
}
}
}
}
public boolean deleteNode(int data){
if (root ==null){
return false;
}
Node item = root;
Node parent=null;
boolean isLeftChild=true;
while (item.getData()!= data){
parent = item;
if (data>item.getData()){
item = item.getRight();
isLeftChild=false;
}else{
item = item.getLeft();
isLeftChild = true;
}
if (item==null){
break;
}
}
if (item==null){
return false;
}
if (item.getLeft()==null && item.getRight() ==null){
if (isLeftChild){
parent.setLeft(null);
}else {
parent.setRight(null);
}
}else if (item.getLeft()==null){
if (item ==root){
root = root.getRight();
} else if (isLeftChild){
parent.setLeft(item.getRight());
}else {
parent.setRight(item.getRight());
}
}else if (item.getRight() ==null){
if (item==root){
root = root.getLeft();
}else if (isLeftChild){
parent.setLeft(item.getLeft());
}else {
parent.setRight(item.getLeft());
}
}else {
Node Succesor=item.getRight(),SuccesorParent=item;
while (Succesor.getLeft() != null){
SuccesorParent =Succesor;
Succesor = Succesor.getLeft();
}
item.setData(Succesor.getData());
if (Succesor == item.getRight()){
item.setRight(Succesor.getRight());
}else {
SuccesorParent.setLeft(Succesor.getRight());
}
}
return true;
}
public void preorderTravel(Node rootNode){
if (rootNode != null){
System.out.println(rootNode.getData());
preorderTravel(rootNode.getLeft());
preorderTravel(rootNode.getRight());
}
}
public void preorderTravel2(){
Stack<Node> stack = new Stack<Node>();
stack.push(root);
Node item = stack.peek();
while ( !stack.empty() ){
System.out.println(item.getData());
if (item.getRight() != null){
stack.push(item.getRight());
}
if (item.getLeft() != null){
item = item.getLeft() ;
}else {
item = stack.peek();
stack.pop();
}
}
}
public void inorderTravel(Node rootNode){
if ( rootNode != null){
inorderTravel(rootNode.getLeft());
System.out.println(rootNode.getData());
inorderTravel(rootNode.getRight());
}
}
public void inorderTravel2(){
Stack<Node> stack = new Stack<Node>();
Node item = this.root;
while (!stack.empty() || item !=null){
while (item != null){
stack.push(item);
item = item.getLeft();
}
if (!stack.empty()){
item = stack.peek();
stack.pop();
}
System.out.println(item.getData());
item = item.getRight();
}
}
public void SubsequentTravel(Node rootNode){
if (rootNode != null){
SubsequentTravel(rootNode.getLeft());
SubsequentTravel(rootNode.getRight());
System.out.println(rootNode.getData());
}
}
public void SubsequentTravel2(Node rootNode){
Stack<Node> stack = new Stack<>();
Node item = rootNode;
while (true){
while (item!=null){
if (item.right!=null){
stack.push(item.right);
}
stack.push(item);
item = item.left;
}
item = stack.pop();
if (item.right!=null&&!stack.isEmpty()){
Node r = stack.pop();
if (item.right == r){
stack.push(item);
item = r;
}else {
stack.push(r);
System.out.println(item.data);
item = null;
}
}else {
System.out.println(item.data);
item = null;
}
if (stack.isEmpty()){
break;
}
}
}
public void LevelTraversal(){
System.out.println("层次遍历树开始。。。");
if (root == null){
System.out.println("二叉树为空");
}else {
Queue<Node> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()){
Node item = queue.element();
System.out.println(item.getData());
if (item.getLeft() != null){
queue.add(item.getLeft());
}
if (item.getRight() != null){
queue.add(item.getRight());
}
queue.remove();
}
}
System.out.println("层次遍历结束。。。");
}
public int getHeight(Node rootNode){
if (rootNode == null){
return 0;
}
int leftHeight = getHeight(rootNode.getLeft());
int rightHeight = getHeight(rootNode.getRight());
return Math.max(leftHeight,rightHeight)+1;
}
public int getHeight2(){
if (root ==null){
return 0;
}
Queue<Node> queue = new LinkedList<>();
queue.add(root);
int height=1;
while ( !queue.isEmpty()){
Node item = queue.peek();
if (item.getLeft()==null && item.getRight()==null){
queue.poll();
}else {
if (item.getLeft() != null){
queue.add(item.getLeft());
}
if (item.getRight() != null){
queue.add(item.getRight());
}
height+=1;
queue.poll();
}
}
return height;
}
public boolean isValidBST(Node root) {
return false;
}
}
哈夫曼树节点
public class HuffmanNode implements Comparable<HuffmanNode>{
int weight;
char code;
HuffmanNode left;
HuffmanNode right;
HuffmanNode parent;
public HuffmanNode() {
}
public HuffmanNode(int weight, char code) {
this.weight = weight;
this.code = code;
}
@Override
public int compareTo(HuffmanNode o) {
return this.weight-o.weight;
}
}
哈夫曼树和哈夫曼编码
public class HuffmanTree {
int numNode;
List<HuffmanNode> Nodes = new LinkedList<>();
HuffmanNode root;
HuffmanNode head;
public void inserNode(HuffmanNode newNode){
if (head==null){
head= newNode;
}else{
HuffmanNode item =head;
HuffmanNode pre = item;
while(item!=null){
if (newNode.weight>item.weight){
pre = item;
item = item.parent;
}else {
break;
}
}
if (item==head){
newNode.parent = head;
head = newNode;
}else {
HuffmanNode temp = pre.parent;
pre.parent = newNode;
newNode.parent = temp;
}
}
}
public void buildHuffmanTree(List<Character> charList,List<Integer> weightList){
for(int i=0;i<charList.size();++i){
inserNode(new HuffmanNode(weightList.get(i),charList.get(i)));
}
while(head!=null && head.parent!=null){
HuffmanNode minNode1 = head;
HuffmanNode minNode2 = head.parent;
head = head.parent.parent;
HuffmanNode newNode = new HuffmanNode(minNode1.weight+minNode2.weight,'0');
newNode.left = minNode1;
newNode.right = minNode2;
minNode1.parent=newNode;
minNode2.parent=newNode;
inserNode(newNode);
}
root = head;
}
public void levelTravel(){
Queue<HuffmanNode> q = new LinkedList<>();
q.add(root);
while(!q.isEmpty()){
int levelSize = q.size();
for (int i=0;i<levelSize;++i){
HuffmanNode item = q.remove();
if (item.left!=null){
q.add(item.left);
}
if (item.right!=null){
q.add(item.right);
}
System.out.print(item.code+" "+item.weight+" ");
}
System.out.println();
}
}
public void Code(HuffmanNode node){
System.out.print(node.code+":");
Stack<Character> s = new Stack<>();
while (node.parent!=null){
if(node.parent.left==node){
s.push('0');
}
if (node.parent.right==node){
s.push('1');
}
node = node.parent;
}
while (!s.isEmpty()){
System.out.print(s.pop());
}
System.out.println();
}
public void AllCode(){
Stack<HuffmanNode> s= new Stack<>();
s.push(root);
HuffmanNode item = root;
while(!s.isEmpty() ){
if (item.code!='0'){
Code(item);
}
if (item.right!=null){
s.push(item.right);
}
if (item.left!=null){
item=item.left;
}else {
item=s.pop();
}
}
}
public char Decoding(String s){
HuffmanNode item = root;
for(int i=0;i<s.length();++i){
char c = s.charAt(i);
if (c=='0'){
item = item.left;
}
if (c=='1'){
item = item.right;
}
}
return item.code;
}
}