树的数组实现之计算策略:html
若是咱们存储的树不是彻底的或者只是相对彻底的,则该数组会为不包含数据的树位置分配空间
git
树的数组实现之模拟连接策略:数组
这种方式使得元素可以连续存储在数组中,所以不会浪费空间,可是该方式增长了删除树中元素的成本。
数据结构
树的遍历
1.先序遍历
即根节点在左右子树以前遍历:
先访问根节点
再先序遍历左子树
再先序遍历右子树
退出
2.中序遍历
先中序遍历左子树
再访问根节点
再中序遍历右子树
退出
3.后序遍历
即根节点在左右子树以后遍历:
前后序遍历左子树
再后序遍历右子树
最后访问根节点
退出
4.层序遍历
即从根节点开始,访问每一层的全部结点,一次一层
学习
以上图为例,三种遍历结果:.net
先序遍历:
1 2 4 5 7 3 6设计
中序遍历:
4 2 7 5 1 3 6调试
后序遍历:
4 7 5 2 6 3 1code
层序遍历:
1 2 3 4 5 6 7htm
二叉树的ADT
二叉树
二叉树是有限个节点的集合,这个集合能够是空集,也能够是一个根节点和至多两个子二叉树组成的集合,其中一颗树叫作根的左子树,另外一棵叫作根的右子树。简单地说,二叉树是每一个节点至多有两个子树的树
彻底二叉树
彻底二叉树是一种特殊的二叉树,知足如下要求:
1.全部叶子节点都出如今 k 或者 k-1 层,并且从 1 到 k-1 层必须达到最大节点数;
2.第 k 层但是不是慢的,可是第 k 层的全部节点必须集中在最左边。
简单地说, 就是叶子节点都必须在最后一层或者倒数第二层,并且必须在左边。任何一个节点都不能没有左子树却有右子树。
满二叉树
若是一棵树的高度为 k,且拥有 2^k-1 个节点,则称之为 满二叉树。
就是说,每一个节点要么必须有两棵子树,要么没有子树。
满二叉树 和 彻底二叉树 的对比图
find
方法只能用在contain
方法里,能不能返回一个BinaryTreeNode对象 ,便于往树中添加新的元素find
方法源代码public T find(T targetElement) { BinaryTreeNode<T> current = findNode(targetElement, root); if (current == null) throw new ElementNotFoundException("LinkedBinaryTree"); return (current.getElement()); }
返回BinaryTreeNode对象的find
方法代码
public BinaryTreeNode<T> findNode(T targetElement) { BinaryTreeNode<T> current = findNode(targetElement, root); if (current == null) throw new ElementNotFoundException("LinkedBinaryTree"); return current; }
2.通过对代码的深刻理解发现这种方法并不可行,由于这样新加入的元素并不能是一个单独的LinkedBinaryTree(链式二叉树)对象,只是一个BinaryTreeNode(二叉树结点)对象,这样会致使新插入的元素不能使用链式二叉树类里的方法。
问题:背部诊断器类运行时一直报错
getLeft
方法和getRight
方法返回的是BinaryTreeNode对象而不是LinkedBinaryTree对象,getLeft
方法和getRight
方法代码//返回结点的左侧子结点 public BinaryTreeNode<T> getLeft() { return left.root; } //返回结点的右侧子结点 public BinaryTreeNode<T> getRight() { return right.root; }
getLeft
方法和getRight
方法代码public LinkedBinaryTree<T> getLeft() { return left.root; } //返回结点的右侧子结点 public LinkedBinaryTree<T> getRight() { return right.root; }
上周无错题!!!
本周的主要学习内容是对树的概念进行了较为深刻的了解,而且对链式二茬表的实现进行了学习和实现,本章课本的例题代码比较复杂(对我来讲很复杂了),在阅读代码的过程当中也是花费了很多时间,经过对本章的学习也是认识到了个人阅读代码能力仍是不好的!但愿之后继续努力,让本身在这方面的能力有所提升吧!
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 4/4 | |
第二周 | 464/464 | 1/2 | 10/14 | 理解掌握了用数组和链表实现栈的方法 |
第三周 | 494/958 | 1/3 | 10/24 | 理解掌握了用数组和链表实现队列的方法 |
第四周 | 1629/2587 | 2/5 | 20/44 | 对用链表和数组实现列表进行了学习 |
第五周 | 856/3443 | 2/7 | 15/59 | 较为深刻的学习了查找和排序方法的实现 |
第六周 | 668/4111 | 1/8 | 20/79 | 学习了链式二叉树的实现 |
计划学习时间:20小时
实际学习时间:20小时
改进状况:注重提升阅读复杂代码的能力,努力提升解决代码bug的能力!!!