非线性集合与数据结构,树的使用和实现。html
树的数组实现之计算策略
:一种可能的计算策略是将元素n的左孩子置于位置(2×n+1),将右孩子置于位置(2×(n+1))(特别是对二叉树的实现)
但有些缺陷:若是咱们存储的树不是彻底的或只是相对彻底的,则该数组会为不包含数据的树位置分配空间,这就浪费了大量的存储空间。
java
树的数组实现之模拟连接策略
:第二个可能策略模拟了操做系统管理内存的方式。容许连续分配数组位置而不用考虑该树的彻底性,该数组的每一元素都是一个结点类,每一结点存储的将是每一孩子(可能还有其双亲)的数组索引,而不是做为指向其孩子(可能还有其双亲)指针的对象引用变量。
缺陷:增长了删除树中元素的成本,由于它要么须要对剩余元素进行移位以维
持连续状态,要么须要保留一个空闲列表。node
遍历一棵树有4种基本方法:
git
两种特殊的二叉树(1)数组
满二叉树( Full Binary Tree ) :每层都“充满”告终点。深度为k,结点总数2^k-1,每层结点数2^i-1
数据结构
彻底二叉树( Complete Binary Tree ):树中所含的n个结点和满二叉树中编号为1至n的结点一一对应。(满二叉树去掉最下层最右边若干结点)
ide
对二叉树的一些操做:
学习
问题1解决方案:lua
高度的定义课本给出的是指从根到叶子之间最远路径的长度。还有的说法是从结点x向下到某个叶结点最长简单路径中边的条数idea
就像是拿楼房来讲,假如一我的提问:楼房的高度有多高?咱们会从底层开始往上数,假如楼有6层,则咱们会说,这个楼有6层楼那么高。
课本上的例子A到F有四层,可是却说他的高度为3。
我在网上看了一些别的例子
人家给出的A到K的高度却为5。
因此我理解其实高度这个主要是因为其根是1层仍是0层产生了不一样,但不少时候按习惯来讲通常都是以1开始。
深度是从根节点往下,深度是从根节点开始(其深度为1)自顶向下逐层累加的。
总的来讲对于整棵树来讲,最深的叶结点的深度就是树的深度;树根的高度就是树的高度。这样树的高度和深度是相等的。
对于树中相同深度的每一个结点来讲,它们的高度不必定相同,这取决于每一个结点下面的叶结点的深度。
public int evaluateNode(BinaryTreeNode root) { int result, operand1, operand2; ExpressionTreeOp temp; if (root==null) result = 0; else { temp = (ExpressionTreeOp)root.getElement(); if (temp.isOperator())//判断temp是不是一个操做符,若是是一个操做数,进入循环,递归 { operand1 = evaluateNode(root.getLeft()); operand2 = evaluateNode(root.getRight()); result = computeTerm(temp.getOperator(), operand1, operand2); } else//若是是操做符,则返回值 result = temp.getValue(); } return result; }
public boolean isOperator() { return (termType == 1); }
相应的解释就在代码后加入了本身的理解。
是最根本的LinkedBinaryTree.java文件中的方法发生了错误,因而进行了调试
发现GetRight和GetLeft的返回值是错误的,继续发现原来是没有编写成功height()方法。
最后得出了正确的显示
上周已总结。
教材中的问题总结的很详细,第一个问题,由于课本上都是用的二叉树为例子,可是
那么当一个节点只有一个孩子的时候,此时没有左右孩子之分。
我以为就算没有两个或以上的孩子,但也能根据位置来肯定相对的左右。图的画法好像有点错。此外,结果好像也有点问题,若是它不是左孩子,那么会先访问该节点,因此我认为答案是D、H、B、E、A、F、C、G。
格式好像有点问题。
第十章内容真的是又多又难呀,树是新接触的概念,其中有不少的细小的知识和概念要去理解,在总结和记忆这些小知识点上花的时间仍是不少的。此外,这章的代码其实很难理解,咱们上个学期学了迭代,但说句实话,内容都有些忘了,并且这章不只使用了迭代,并且代码的逻辑,代码为何这样写都有些难以理解,书上的代码有些都由于时间限制,就先囫囵吞枣了一番,以后才慢慢理解了。
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | ||
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 10/10 | |
第二周 | 326/326 | 1/2 | 18/28 | |
第三周 | 784/1110 | 1/3 | 25/53 | |
第四周 | 2529/3638 | 2/5 | 37/90 | |
第五周 | 1254/4892 | 2/7 | 20/110 | |
第六周 | 1403/6295 | 2/9 | 32/142 |
计划学习时间:30小时
实际学习时间:32小时
改进状况:
这周由于学习内容较多,因此时间也较长,但仍是要提升一下学习的效率。