由唯一的根和若干互不相交的子树,每一颗子树又是一棵树。
树的存储有两种方式:顺序存储
、链式存储
如知道了节点 i,那么 tree[i] 就是 i 的双亲节点
左孩子指针 | 数据 | 右孩子指针 |
---|---|---|
lchild | data | rchilid |
数据结构如下:
type BTNode struct { data int lchild *BTNode rchilid *BTNode }
在普通树上再加两个条件,就构成了完全二叉树。
二叉树又分为满二叉树,完全二叉树,完全二叉树是由满二叉树由右到左,从下到上排着删得到的。不能跳着删除
k
层深的树,最多有 2k -1 个节点对于完全二叉树的第 i 结点来说:
i 的双亲节点为 【i/2】向下取整
如果 n>=2i
那么 i
的左孩子的编号为 2i
,如果 n<2i
则无左结点
如果n>=2i+1
,则右节点为 2i+1
,如果 n<2i+1
则无右节点
type treeNode struct { data int lchild *treeNode rchild *treeNode } // 先序遍历 func preorder(treenode *treeNode) { if treenode != nil { Visit(treenode) preorder(treenode.lchild) preorder(treenode.rchild) } }
func Level(node *BTNode) { que := make([]*BTNode, 20) //20长的循环队列 front, rear := 0, 0 //初始化队列,当front=rear表示队为空 //rear+1=front 表示队列已经满了。 if node != nil { rear = (rear + 1) % 20 // 根节点入队 que[rear] = node for front != rear { // 如果不是空队 front = (front + 1) % 20 q := que[front] // 跟节点出队 Visit(q) if q.lchilid != nil { // 如果有左节点就是入队 rear = (rear + 1) % 20 que[rear] = q.lchilid } if q.rchilid != nil { // 如果有右节点就入队 rear = (rear + 1) % 20 que[rear] = q } } } }
二叉树的深度,就是左右子树中,深度最大的,然后再加一; 所以步骤是,先求左子树,再求右子树,最后求 max{左,右}+1
森林还有树之间的转换,孩子兄弟链表的存储方式,具体还是看书吧。
赫夫曼树又叫最优二叉树,它的特点是带权路径最短。
赫夫曼树的特点: