4.基本的树的知识。根不是内部结点。html
10.树的全部叶子都位于同一层或者至少是彼此相差不超过一个层,就称之为是平衡。上图的F,G,H,I,J位于同一层,与D只相差一层,因此上图的树是平衡的。下图的树由于O与D相差了两层超过一层,因此这个树是不平衡的。前端
11.满树:若是一棵n元树的全部叶子都位于同一层且每一结点要么是一片叶子要么正好具备n个孩子,则称此树是满的。如图:java
14.计算策略:特别是二叉树,一种策略是使用数组来存储一棵树。node
①前序遍历:从根结点开始,访问每一结点及其孩子。git
②中序遍历:从根结点开始,访问结点的左孩子,而后是该结点,再而后是任何剩余结点。数组
③后序遍历:从根结点开始,访问结点的孩子,而后是该结点。数据结构
④层序遍历:从根结点开始,访问每一层的全部结点,一次一层。post
19.树的操做及说明:学习
22.决策树:结点表示决策点(也就是进行判断的条件),左子结点表示“否”,右子结点表示“是”。this
问题1解决方案:按照左孩子的计算公式算就能够,实际上它的位置至关于满树时所在的位置。
问题2解决方案:彻底树从根结点到倒数第二层知足满树,最后一层能够不彻底填充,其叶子结点都靠左对齐。满树必定是一棵彻底树。以下图:
public void preOrder(BinaryTreeNode<T> root) { if (root != null) { System.out.print(root.element + " "); preOrder(root.left); preOrder(root.right); } }
public void inOrder(BinaryTreeNode<T> root) { if (root != null) { inOrder(root.left); System.out.print(root.element + " "); inOrder(root.right); } }
public void postOrder(BinaryTreeNode<T> root) { if (root != null) { postOrder(root.left); postOrder(root.right); System.out.print(root.element + " "); } }
public void levekOrder() { if (root != null) { LinkedList<BinaryTreeNode> queue = new LinkedList<>(); BinaryTreeNode<T> p; queue.push(root); while (!queue.isEmpty()) { p = queue.removeFirst(); System.out.print(p.element + " "); if (p.left != null) queue.addLast(p.left); if (p.right != null) queue.addLast(p.right); } } else System.out.println("null"); }
问题4:表达式树的计算过程是什么?
表达式树的求值是从下往上的,对本树的分析过程,先是5-3=2,再是2*4=8,而后8+9=17
总结:①从下往上计算;②左右两支分开计算;③四则运算前面的数都是左孩子,后面的数都是右孩子。
问题5解决方案:最深的叶结点的深度就是树的深度;树根的高度就是树的高度。同结点的,深度数=高度数+1。
问题1:BinaryTreeNode类中此方法的代码解读。
问题1解决方案:此方法运用了递归原理,判断左孩子是否存在,只要存在就+1,最后得出左孩子的总数用children变量存储。以后再算右孩子的数量,一样运用递归原理,判断右孩子是否存在,存在就+1,最后与左孩子的总数加起来,成为全部孩子(也就是没有根结点)的数量。
问题2解决方案:整体思想有点相似于层序输出,从根开始从右往左依次分层输出。可是须要在输出结点的同时,须要记录本层每一个结点对应下一层的孩子数
public String printTree() { UnorderedListADT<BinaryTreeNode<ExpressionTreeOp>> nodes = new ArrayUnorderedList<BinaryTreeNode<ExpressionTreeOp>>(); UnorderedListADT<Integer> levelList = new ArrayUnorderedList<Integer>(); BinaryTreeNode<ExpressionTreeOp> 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 + "\n\n"; 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; }
getHeight()
是高度,因此能够知道possibleNodes(最多结点数为)2的^(printDepth+1)-1int printDepth = this.getHeight(); int possibleNodes = (int)Math.pow(2, printDepth +1);
nodes.addToRear(root); Integer currentLevel = 0 Integer previousLevel = -1; levelList.addToRear(currentLevel);
while (countNodes < possibleNodes) { countNodes = countNodes + 1; current = nodes.removeFirst(); currentLevel = levelList.removeFirst();
无上面代码的效果图:
result = result + "\n\n";
是由于二叉树,为了造成树的形状,因此至关于\n\n为一组的存在,不会让数在一行,同时保证了每行第一个数以前的空格数。其中for循环的循环体为了保证每行第一个数以前的空格数。if (currentLevel > previousLevel) { result = result + "\n\n"; previousLevel = currentLevel; for (int j = 0; j < ((Math.pow(2, (printDepth - currentLevel))) - 1); j++) result = result + " "; }
无上面代码的效果图:
无上面代码for循环的效果图:
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 + " "; } }
无上面代码的效果图:
问题3:背部诊断器的相关文件是存在的,可是不能运行。
问题3解决方案:由于文件放错位置了,默认是工程根目录,和src是同一个级别的文件。不能放在src文件中,更不能放在src文件的子文件中。
问题4:DecisionTree类的代码理解。
public DecisionTree(String filename) throws FileNotFoundException { File inputFile = new File(filename); Scanner scan = new Scanner(inputFile); int numberNodes = scan.nextInt(); scan.nextLine(); int root = 0, left, right; List<LinkedBinaryTree<String>> nodes = new java.util.ArrayList<LinkedBinaryTree<String>>(); for (int i = 0; i < numberNodes; i++) nodes.add(i,new LinkedBinaryTree<String>(scan.nextLine())); while (scan.hasNext()) { root = scan.nextInt(); left = scan.nextInt(); right = scan.nextInt(); scan.nextLine(); nodes.set(root, new LinkedBinaryTree<String>((nodes.get(root)).getRootElement(), nodes.get(left), nodes.get(right))); } tree = nodes.get(root); }
文件内容以下图,第一个数13为结点数。
下图是从文件中读出的信息所组成的树。
List<LinkedBinaryTree<String>> nodes = new java.util.ArrayList<LinkedBinaryTree<String>>(); for (int i = 0; i < numberNodes; i++) nodes.add(i,new LinkedBinaryTree<String>(scan.nextLine()));
while (scan.hasNext()) { root = scan.nextInt(); left = scan.nextInt(); right = scan.nextInt(); scan.nextLine(); nodes.set(root, new LinkedBinaryTree<String>((nodes.get(root)).getRootElement(), nodes.get(left), nodes.get(right))); }
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 2/2 | |
第二周 | 1010/1010 | 1/2 | 10/12 | |
第三周 | 651/1661 | 1/3 | 13/25 | |
第四周 | 2205/3866 | 1/4 | 15/40 | |
第五周 | 967/4833 | 2/6 | 22/62 | |
第六周 | 1680/6513 | 1/7 | 34/96 |
计划学习时间:20小时
实际学习时间:34小时
改进状况:这周的新内容难度很大,学习时间远超本身的计划时间