现实生活中很多结构都是树的抽象,模拟的树结构相当于旋转 180°
的树。
树结构对比于数组/链表/哈希表有哪些优势呢?
数组:
链表:
哈希表:
树结构:
总的来说:每种数据结构都有自己特定的应用场景。
树结构:
树(Tree):由 n(n ≥ 0)个节点构成的有限集合。当 n = 0 时,称为空树。
对于任意一棵非空树(n > 0),它具备以下性质:
r
表示;如图,树结构的组成方式类似于链表,都是由一个个节点连接构成。不过,根据每个父节点子节点数量的不同,每一个父节点需要的引用数量也不同。比如节点 A 需要 3 个引用,分别指向子节点 B,C,D;B 节点需要 2 个引用,分别指向子节点 E 和 F;K 节点由于没有子节点,所以不需要引用。
这种方法缺点在于我们无法确定某一结点的引用数。
这种表示方法可以完整地记录每个节点的数据,比如:
//节点 ANode{//存储数据this.data = data//统一只记录左边的子节点this.leftChild = B//统一只记录右边的第一个兄弟节点this.rightSibling = null}//节点 BNode{this.data = datathis.leftChild = Ethis.rightSibling = C}//节点 FNode{this.data = datathis.leftChild = nullthis.rightSibling = null}
这种表示法的优点在于每一个节点中引用的数量都是确定的。
以下为儿子 - 兄弟表示法组成的树结构:
将其顺时针旋转 45° 之后:
这样就成为了一棵二叉树,由此我们可以得出结论:任何树都可以通过二叉树进行模拟。但是这样父节点不是变了吗?其实,父节点的设置只是为了方便指向子节点,在代码实现中谁是父节点并没有关系,只要能正确找到对应节点即可。