文章目录
树(tree)与二叉树(binary tree)
树的概念可以对比单链表来,而且链表可以当作特殊的树。假如链表的next有两个以上的话,就会形成分叉,即树形结构。二叉树是指next指针只有两个以内。所以树跟二叉树是二维的数据结构。(区分图(graph),图结构中可能指向相同的元素,形成一个环。树是特殊化的图)
- 元素之间非线性,不是一对一了。
- 拥有相对的父节点与子节点。
存储形式
树存储结构
树与二叉树的区别是二叉树的兄弟最多为2,也就是一个父节点最多有两个字节点。大部分使用情况下,都是使用二叉树以及其变种结构(平衡二叉树(AVL)、二叉搜索树(右>左 、二分查找),红黑树(路径平衡)。。。),其中因为二叉搜索树可能不是平衡二叉树,为了不是最坏情况(O(n))插入删除与搜索,大部分语言实现二叉搜索树使用红黑树。
为什么出现树的结构?
一维的链表可以采用跳表来加速查找。但是现实以及工程问题都需要二维以上来形象描述解决问题,例如斐波那契额函数,用树形结构可以很好的看到函数运算的内容。以及各种棋类游戏,由一个节点扩散出好多个可以选择的节点(节点树多少决定棋类游戏的难度)。在这种树形结构选择能获胜的节点就是简单的游戏AI。
代码表现
二叉树(Binary Tree)
class BinaryTree:
def __init__(self, x, left=None, right=None):
self.val = x
self.left = left
self.right = right
def __str__(self):
if self.left is None and self.right is None:
return str(self.val)
return str(self.val) + '(' + str(self.left) + ',' + str(self.right) + ')'
tree = BinaryTree(1, BinaryTree(2, BinaryTree(4), BinaryTree(5)), BinaryTree(3, BinaryTree(6), BinaryTree(7)))
print(tree) #1(2(4,5),3(6,7))
从返回括号形式看,树也可以描述为一种包含关系。1包含(2,3),2包含(4,5),3包含(6,7)。
二叉搜索树(Binary search tree)
class BST:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
def insert(self, x):
if x < self.val:
if self.left is None:
self.left = BST(x)
else:
self.left.insert(x)
elif x > self