chapter 11 二叉树和其他树
-
树
非空有限元素集合
有一个元素是根
其余元素组成子树 -
二叉树
高度 深度 级数
度(孩子的个数)
二叉树和树的区别:
二叉树可以为空,但树不能为空
二叉树中每个元素都恰好有两棵子树(其中一个或两个可能为空),树可以有任意多个子树
二叉树中每个元素的子树都是有序的,而数的子树是无序的 -
二叉树的特性
最大高度为n,最小为 log2(n+1)
满二叉树:恰好有2h-1个元素
完全二叉树:深度为k,前k-1层是满二叉树,第k层上都连续排列在第k层的左端 -
二叉树的描述
数组描述:按照二叉树对元素的编号方法,将元素存储在数组中**链表描述**:元素,左右孩子
-
二叉树的常用操作
确定其高度:dfs
确定其元素数目:递归
复制:递归
显示二叉树:递归
确定两棵二叉树是否一样:输出
删除整棵树 -
二叉树遍历
前序遍历(根左右)
中序遍历(左根右)
后序遍历(左右根)
层次遍历(队列) -
抽象数据类型
empty()
size()
preOrder()
inOrder()
postOrder()
LevelOrder() -
类linkedBinaryTree
-
应用
计算高度:递归,比较左右子树的高度,谁高选谁,基本条件是叶子节点高度为1
森林:0或多可树
首先得到每棵树的二叉树表示:第一个孩子为左孩子,兄弟为右孩子
然后第i棵作为第i-1棵树的右子树
并查集:find() union(a,b)
规则:
重量规则(将重量重的作为父节点)
高度原则(将高度高的作为父节点)
紧凑路径(将路径上的节点都连到父节点)
前序遍历的非递归实现(根左右)
每遇到一个结点,先访问该节点,并把该结点的非空右孩子入栈,然后遍历其左孩子
左子树遍历完后,从栈中弹出右子树的根,继续遍历
中序遍历的非递归实现(左根右)
每遇到一个结点就把它入栈,然后遍历其他左子树,遍历完左子树后,弹出栈顶节点并访问,按照右节点指示的地址访问右子树
后序遍历的非递归实现
每遇到一个结点就入栈,然后遍历左子树,遍历完左子树后,回到栈顶节点,按照右链遍历右子树,遍历完右子树后,弹出栈顶节点并访问