树与二叉树
树的基本概念
树是节点的有限集合(不区分节点和结点,我觉得差不多)
子树就是以一个树的分支节点为根节点组成的一个子集合。一个树可有多条互不相交的子树组成。
度是一个节点拥有的子树的数目。其中度为0的节点成为叶子活终端节点,不为0就称为分支节点。
层代的意思,父母是一代,你是一代的意思
一个树的度是指树内节点拥有最大的度。
孩子指一个节点子树的根
兄弟同一个双亲的孩子
堂兄弟两个节点的双亲(即四个节点)在同一层
深度树里面节点的最大层数
森林多个不相交的树的集合(没有共同的节点包括根节点)
祖先和子孙(概念不写了,感觉就是一些人弄出来认关系的,根本没有严格的定义,一个森林有多个树组成,树底下有子树,那这个树不就是森林吗。不知道森林要不要根节点这一说。应该没有,不然概念不是重复了??不能弄混了)
有序树树中节点的子树可看成从左至右的顺序放置,否则称为无序树
树的基本操作
初始化:InitTree(&T)
回收:DestroyTree(&T)
创建:CreateTree(&T,definition)根据定义构造树
清空:ClearTree(&T)注意与回收的区别
判断是否为空TreeEmpty(T)
判断树深TreeDeepth(T)
返回根节点的值Root(T)
返回某节点的值Value(T,cur_e)cur_e在有序树中是某个节点的序号
给cur_e处的节点赋value值Assign(T,cur_e,value)
cur_e节点(非根)的双亲Parent(T,cur_e)
cur_e的左孩子LeftChild(T,cur_e)
cur_e的右堂兄弟RightSibling(T,cur_e)
InsertChild(&T,&p,i,c)
DeleteChild(&T,&p,i)
按(先序,中序,后序)调用一次visit()函数TraverseTree(T,visit())
二叉树的性质
节点最多只有两个子树,所有节点的度不大于2,子树存在左右之分,次序不能颠倒.
满二叉树含有(2^k)-1个节点的二叉树(k为树深)
完全二叉树深度为k,有n个节点的二叉树上的每个节点与满二叉树的节点一一对应,就是这种树。
具有两个特点:
叶子节点只在最大的两层上出现
对任意节点,右分支下的子孙最大层为L,左分支下的子孙最大层必为L或L+1
二叉树五个重要的性质:
- 二叉树的第i层最多只有2^(i-1)个节点
- 深度为K的二叉树最多只有(2^k)-1个节点
- 任意一颗树T,终端节点数n2,度为2的节点数为n1,那么n2=n1+1
- 具有n个节点的完全二叉树的深度为(logn)+1的下界(算法中默认以2为对数的底)
- 完全二叉树按层序编号(第一层到(logn)+1的下界),,每层从左到右,对每个节点i有:
- i>1,双亲PARENT(i)是节点i/2的下界
- 若2*i>n,该节点无左孩子,反之其左孩子LCHILD(i)是节点2*i
- 若2i+1>n.节点没有右孩子,反之其右孩子为2i+1
二叉树相对来说多出来四种遍历顺序操作:
先序遍历:PreOrderTraverse(T,visit())
中序遍历:InOrderTraverse(T,visit())
后续遍历:PostOrderTraverse(T,visit())
层序遍历:LevelOrderTraverse(T,visit())