当前位置:文档之家› 实验五二叉树

实验五二叉树

实验五二叉树一、实验目的:1、掌握二叉树的创建算法、掌握二叉树的遍历算法2、掌握哈夫曼树的构造和应用,利用哈夫曼方法及其编/译码技术实现对传输信息编码/译码系统。

二、实验内容:1、在一棵二叉链表表示的二叉树中,实现以下操作。

1)输出叶子结点。

2)求二叉树中叶子结点个数。

3)将每个结点的左子树与右子树交换。

4)已知先根和中根次序遍历序列构造二叉树。

5)判断两棵二叉树是否相等。

6)求结点所在的层次。

7)复制一棵二叉树。

8)判断一棵二叉树是否为完全二叉树。

算法及测试结果粘贴如下:package Q1;public class BinaryNode<T> {public T data;public BinaryNode<T> left,right;public BinaryNode(T data,BinaryNode<T> left,BinaryNode<T> right){ this.data=data;this.left=left;this.right=right;}public BinaryNode(T data){this(data,null,null);}public BinaryNode(){this(null,null,null);}}package Q1;public class BinaryTree<T>{public Node<String> head_pre;public Node<String> head_in;public BinaryNode<T> root;public BinaryTree(){this.root=null;}public boolean isEmpty(){return this.root==null;}private BinaryTree<String> init_make(){BinaryTree<String> bitree=new BinaryTree<String>();BinaryNode<String> child_f,child_d,child_b,child_c;child_d=new BinaryNode<String>("D",null,newBinaryNode<String>("G"));child_b=new BinaryNode<String>("B",child_d,null);child_f=new BinaryNode<String>("F",newBinaryNode<String>("H"),null);child_c=new BinaryNode<String>("C",newBinaryNode<String>("E"),child_f);bitree.root=new BinaryNode<String>("A",child_b,child_c);return bitree;}private void leaf(BinaryNode<String> p){if(p!=null){if(p.left==null && p.right==null){System.out.print(p.data+" ");}leaf(p.left);leaf(p.right);}}private int leaf_count(BinaryNode<String> p){if(p==null)return 0;if(p.left==null && p.right==null)return 1;else return leaf_count(p.left)+leaf_count(p.right);}private void exchange(BinaryNode<String> p){BinaryNode temp = new BinaryNode();if(p!=null){temp=p.left;p.left=p.right;p.right=temp;exchange(p.left);exchange(p.right);}}public BinaryTree(T[] prelist,T[] inlist){this.root=preOrder_inOrder_make(prelist,inlist,0,0,prelist.length);}private BinaryNode<T> preOrder_inOrder_make(T[] preList,T[] inList,int preStart,int inStart,int n){if(n<=0)return null;T elem=preList[preStart];BinaryNode<T> p=new BinaryNode<T>(elem);int i=0;while(i<n && !elem.equals(inList[inStart+i]))i++;p.left=preOrder_inOrder_make(preList,inList,preStart+1,inStart,i);p.right=preOrder_inOrder_make(preList,inList,preStart+i+1,inStart+i+1,n -1-i);return p;}private void preOrder(BinaryNode<String> p){if(p!=null){System.out.print(p.data+" ");preOrder(p.left);preOrder(p.right);}}private void inOrder(BinaryNode<String> p){if(p!=null){preOrder(p.left);System.out.print(p.data+" ");preOrder(p.right);}}private boolean CompTree(BinaryNode<String> tree1,BinaryNode<String> tree2){if (tree1 == null && tree2 == null){return true;}if (tree1 == null || tree2 == null){return false;}if (tree1.data != tree2.data){return false;}if (CompTree(tree1.left,tree2.left) &&CompTree(tree1.right,tree2.right) ||CompTree(tree1.left,tree2.right) &&CompTree(tree1.right,tree2.left)){return true;}return false;}private int getLevel(T x){return getLevel(root, 1, x);}private int getLevel(BinaryNode<T> p, int i, T x){if (p==null)return -1;if (p.data.equals(x))return i;int level = getLevel(p.left, i+1, x);if (level==-1)level = getLevel(p.right, i+1, x);return level;}private BinaryNode<T> copy(BinaryNode<T> p){if (p==null)return null;BinaryNode<T> q = new BinaryNode<T>(p.data);q.left = copy(p.left);q.right = copy(p.right);return q;}private boolean isCompleteBinaryTree(){if (this.root==null)return true;LinkedQueue<BinaryNode<T>> que = new LinkedQueue<BinaryNode<T>>();que.enqueue(root);BinaryNode<T> p=null;while (!que.isEmpty()){p = que.dequeue();if (p.left!=null ){que.enqueue(p.left);if (p.right!=null)que.enqueue(p.right);else break;}else if (p.right!=null)return false;else break;}while (!que.isEmpty()){p = que.dequeue();if (p.left!=null || p.right!=null)return false;}return true;}public static void main(String[] args){BinaryTree<String> tree1 =new BinaryTree<String>();tree1=tree1.init_make();System.out.print("这棵树的叶子结点分别为: ");tree1.leaf(tree1.root);System.out.println();int num=tree1.leaf_count(tree1.root);System.out.println("这棵树的叶子结点个数为: "+num);System.out.print("这棵树的前序遍历为: ");tree1.preOrder(tree1.root);System.out.println();System.out.print("这棵树左右子树交换后的前序遍历为: ");tree1.exchange(tree1.root);tree1.preOrder(tree1.root);System.out.println();String[] preList ={"A","B","D","G","C","E","F","H"};String[] inList ={"D","G","B","A","E","C","H","F"};BinaryTree<String> tree_pre_in =newBinaryTree<String>(preList,inList);System.out.print("这棵树的前序遍历为: ");tree1.preOrder(tree_pre_in.root);System.out.println();BinaryTree<String> tree2 =new BinaryTree<String>();tree2=tree2.init_make();System.out.println("判断这两棵二叉树时候相同:"+pTree(tree1.root ,tree2.root));System.out.println("结点B所在的层数:"+tree1.getLevel("B"));BinaryTree<String> tree3 =new BinaryTree<String>();tree3.copy(tree1.root);System.out.println("这课二叉树是否为完全二叉树:"+tree1.isCompleteBinaryTree());}}package Q1;public class LinkedQueue<T> {private Node<T> front,rear;public LinkedQueue(){this.front=this.rear=null;}public boolean isEmpty(){return this.front==null&&this.rear==null;}public void enqueue(T x){if(x==null)return;Node<T> q=new Node<T>(x,null);if(this.front==null)this.front=q;elsethis.rear.next=q;this.rear=q;}public T dequeue(){if(isEmpty())return null;T temp=this.front.data;this.front=this.front.next;if(this.front==null)this.rear=null;return temp;}}package Q1;public class Node<T> {public T data;public Node<T> next;public Node(T data,Node<T> next){this.data=data;this.next=next;}public Node(){this(null,null);}}2、[问题描述](设计性实验)哈夫曼树很易求出给定字符集及其概率(或频度)分布的最优前缀码。

相关主题