
二叉树的二叉链表表示.doc
8页实习报告二“二叉树的二叉链表表示”演示程序 ====(一) 、程序的功能和特点1. 程序功能:利用链表对非线性二叉树进行存储表示和访问能够创建二叉树,并且能够按前序遍历显示输出所创建的二叉树2. 程序特点:采用java面向对象语言,对二叉树用二叉链表用类进行封装能够创建二叉树,并且能够按前序遍历显示输出所创建的二叉树二) 、程序的算法设计算法一:“按前序遍历方式建立二叉树”算法:1. 【逻辑结构与存储结构设计】 逻辑结构:非线性结构 存储结构:链式存储结构头指针bt 头结点指针btAAC∧BC∧B∧F∧∧E∧D∧∧F∧∧E∧D∧∧G∧∧G∧ (a) 带头指针的二叉链表 (b) 带头结点的二叉链表 链式 二叉树的二叉链表表示示意图开始创建2. 【基本操作设计】键盘输入二叉树的二叉链的数据if ( item != RefValue ) Y N封闭叶子结点创建二叉链表结点 递归生成左右子树创建成功返回二叉树的头指针创建结束3. 【算法设计】 创建二叉链表文字说明: (1).首先按前序输入二叉树。
(2).判断是否是封闭结点的标识,如果不是则创建二叉链表,递归生成其左右子树 (3).如果是封闭结点标识则结束; (4).插入成功返回二叉链表的头指针4. 【高级语言代码】//按前序遍历方式建立二叉树 public BinTreeNode preOrderCreate ( BinTreeNode p ) { double item=0.0; System.out.println("按照前序遍历次序每次输入一个结点值"); try { /* 键盘接受一个double数 */ BufferedReader br=new BufferedReader( new InputStreamReader(System.in) ); item=Double.parseDouble(br.readLine()); } catch(IOException e){} if ( item != RefValue ) { //读入的不是参照值 p=new BinTreeNode(item); p.leftChild=preOrderCreate(p.leftChild); //递归生成左子树 p.rightChild=preOrderCreate(p.rightChild); //递归生成右子树 //实参是空二叉树,得到返回的子二叉树 } else //读入的是参照数 p=null; //封闭叶子结点 return p; //返回二叉树p } } 算法二:“按前序遍历方式输出二叉树”算法:1. 【逻辑结构与存储结构设计】 逻辑结构:非线性结构。
存储结构:链式存储结构leftChilddatarightChild结构如图所示:开始输出2. 【基本操作设计】判断链表是否为空? Y N输出该节点的数据输出该节点的数据递归输出其左,右子树输出结束3.【算法设计】 文字说明: (1).首先取链表元素判断链表是否为空 (2).链表非空先输出该结点的值,在递归调用该方法输出其左右子树 (3).链表为空则结束,结束退出4.【高级语言代码】 //按前序遍历方式输出二叉树 public void preOrderTraverse (BinTreeNode p) { if ( p != null ) { //输出根结点数据域 System.out.print(" "+p.GetData()); //递归输出p的左子树 preOrderTraverse ( p.leftChild ); //递归输出p的右子树 preOrderTraverse (p.rightChild ); } } (三)、程序中类的设计 “BinTreeNode”类:1. 【逻辑结构与存储结构】 逻辑结构:非线性结构。
存储结构:链式存储结构二叉链表也可以带头结点的方式存放,如图(b)所示头指针bt 头结点指针btAAC∧BC∧B∧F∧∧E∧D∧∧F∧∧E∧D∧∧G∧∧G∧ (a) 带头指针的二叉链表 (b) 带头结点的二叉链表 链式 二叉树的二叉链表表示示意图2. 【主要成员变量说明】 主要成员变量有:data:为结点的数据域,为double类型变量用于存放节点的数据leftChild,rightChild:为节点的指针域,为BinTreeNode类型变量,存放结点的指向下一个节点的指针结构如图所示:leftChilddatarightChild3. 【主要成员方法说明】 public BinTreeNode ( double item): 为BinTreeNode的构造函数:一个叶子结点 参数为该结点的数据 public BinTreeNode ( double item, BinTreeNode left,BinTreeNode right):构造函数:非一个叶子结点。
含有三个参数,分别为该结点的数据,左子树和右子树public double GetData():返回数据域的值4.【高级语言代码】 / //定义“二叉链表结点”类class BinTreeNode { private double data; //结点数据域 BinTreeNode leftChild; //结点左右指针域 BinTreeNode rightChild; //构造函数:一个叶子结点 public BinTreeNode ( double item) { data=item; //左右指针域自动为null } //构造函数:一个非叶子结点 public BinTreeNode ( double item, BinTreeNode left,BinTreeNode right) { data=item; leftChild=left; rightChild=right; } //返回结点数据域的值 public double GetData() { return data; } } //定义“二叉链表结点”类完毕 “cBinaryTree”类:1. 【逻辑结构与存储结构】 逻辑结构:非线性结构。
存储结构:链式存储结构二叉链表可以有不带头结点(a)和带都结点(b)头指针bt 头结点指针btAAC∧BC∧B∧F∧∧E∧D∧∧F∧∧E∧D∧∧G∧∧G∧ (a) 带头指针的二叉链表 (b) 带头结点的二叉链表 2. 【主要成员变量说明】 主要成员变量为:root:表示根节点,为BinTreeNode类型RefValue:参照值为double类型3. 【主要成员方法说明】 public cBinaryTree ( double v):构造函数:建立一棵空树,并设定参照值 public void CreateBinTree() :以root为根建立二叉树 public BinTreeNode preOrderCreate ( BinTreeNode p,String s) :按前序遍历方式建立二叉树public BinTreeNode GetRoot():得到二叉树的根public void preOrderTraverse (BinTreeNode p):前序遍历方式输出二叉树。
public static void main(String []args) :主函数 4.【高级语言代码】 //***********定义“二叉链表”类*********public class cBinaryTree { private BinTreeNode root; //根节点 private double RefValue; //参照值:在建立二叉树之前, //给定一个结点数据域中不可能出现的数, //用来标记二叉树的一条分支到此封闭 //构造函数:建立一棵空树,并设定参照值 public cBinaryTree ( double v) { RefValue=v; root=null; } //以root为根建立二叉树 public void CreateBinTree(){ root=preOrderCreate(root); //实参是空二叉树 //根root得到返回的二叉树根节点 } //按前序遍历方式建立二叉树 public BinTreeNode preOrderCreate ( BinTreeNode p ) { double item=0.0; System.out.println("按照前序遍历次序每次输入一个结点值。
"); try { /* 键盘接受一个double数 */ BufferedReader br=new BufferedReader( new InputStreamReader(System.in) ); 。












