********《数据结构与面向对象程序设计》实验八报告
课程:《程序设计与数据结构》
班级: ********
姓名: ********
学号:20182332
实验教师:王*强
实验日期:2019年10月28日
必修/选修: 必修
1.实验内容
- 参考教材PP16.1,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)。用JUnit或自己编写 驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图。
- 基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树。用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息。
- 自己设计并实现一颗决策树,提交测试代码运行截图,要全屏,包含自己的学号信息
- 输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,正常评分。如果用到了树,即使有小的问题,也酌情给满分)
2.实验过程及结果:
- 链树的实现:
getRight |
---|---
public LinkedBinaryTree<T> getRight()
{
LinkedBinaryTree node = new LinkedBinaryTree();
node.root=root.getRight();
// return new LinkedBinaryTree(root.getRight());
return node;
}
contains |
---|---
public boolean contains(T targetElement)
{
if (find(targetElement)==targetElement){
return true;
}
else {
return false;
}
}
public T find(T targetElement) throws ElementNotFoundException
{
BinaryTreeNode<T> current = findNode(targetElement, root);
if (current == null)
throw new ElementNotFoundException("LinkedBinaryTree");
return (current.getElement());
}
private BinaryTreeNode<T> findNode(T targetElement,
BinaryTreeNode<T> next)
{
if (next == null)
return null;
if (next.getElement().equals(targetElement))
return next;
BinaryTreeNode<T> temp = findNode(targetElement, next.getLeft());
if (temp == null)
temp = findNode(targetElement, next.getRight());
return temp;
}
toString |
---|---
public String toString()
{
UnorderedListADT<BinaryTreeNode> nodes =
new ArrayUnorderedList<BinaryTreeNode>();
UnorderedListADT<Integer> levelList =
new ArrayUnorderedList<Integer>();
BinaryTreeNode current;
String result = "";
int printDepth = this.getHeight();
int possibleNodes = (int)Math.pow(2, printDepth + 1);
int countNodes = 0;
nodes.addToRear(root);
Integer currentLevel = 0;
Integer previousLevel = -1;
levelList.addToRear(currentLevel);
while (countNodes < possibleNodes)
{
countNodes = countNodes + 1;
current = nodes.removeFirst();
currentLevel = levelList.removeFirst();
if (currentLevel > previousLevel)
{
result = result + "
";
previousLevel = currentLevel;
for (int j = 0; j < ((Math.pow(2, (printDepth - currentLevel))) - 1); j++)
result = result + " ";
}
else
{
for (int i = 0; i < ((Math.pow(2, (printDepth - currentLevel + 1)) - 1)) ; i++)
{
result = result + " ";
}
}
if (current != null)
{
result = result + (current.getElement()).toString();
nodes.addToRear(current.getLeft());
levelList.addToRear(currentLevel + 1);
nodes.addToRear(current.getRight());
levelList.addToRear(currentLevel + 1);
}
else {
nodes.addToRear(null);
levelList.addToRear(currentLevel + 1);
nodes.addToRear(null);
levelList.addToRear(currentLevel + 1);
result = result + " ";
}
}
return result;
}
preorder |
---|---
public Iterator<T> iteratorPreOrder()
{
ArrayUnorderedList<T> tempList = new ArrayUnorderedList<T>();
preOrder(root, tempList);
return new TreeIterator(tempList.iterator());
}
protected void preOrder(BinaryTreeNode<T> node,
ArrayUnorderedList<T> tempList)
{
if(node!=null)
{
System.out.print(node.getElement()+" ");
tempList.addToRear(node.getElement());
preOrder(node.getLeft(),tempList);
preOrder(node.getRight(),tempList);
}
}
- 基于中序、先序序列构造树:
- 二叉树前序遍历:先根节点,后左子树,再右子树。
- 二叉树中序遍历:先左子树,后根节点,再右子树。
- 二叉树中序遍历:先左子树,后右子树,再根节点。
- 设计一棵决策树:
- 中缀转后缀并计算:
实验过程中遇到的问题和解决过程
- 空指针异常
- 解决方案:检查数据的传递,进行单步调试后发现是import了一个和实验无关的包,删除该import即可。
感想
实验有点难,借鉴了书上和网上的一部分代码。。。还需努力