二叉树
二叉树:一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵分别称为左子树和右子树的二叉树组成。
二叉树的特点:
- 1.每个结点最多有两棵子树,即二叉树不存在度大于 2 的结点。
- 2.二叉树的子树有左右之分,其子树的次序不能颠倒,因此二叉树是有序树。
满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。
完全二叉树:对于深度为K的,有n 个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。满二叉树是一种特殊的完全二叉树。
平衡二叉树:是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
二叉树的性质
- 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有 2 ( i − 1 ) 2^(i-1) 2(i−1) (i>0)个结点 。
- 若规定只有根节点的二叉树的深度为1,则深度为K的二叉树的最大结点数是 2 k − 1 2^k-1 2k−1 (k>=0)。
- 对任何一棵二叉树, 如果其叶结点个数为 n0, 度为2的非叶结点个数为 n2,则有n0=n2+1 。
- 具有n个结点的完全二叉树的深度k为 log 2 ( n + 1 ) \log_2(n+1) log2(n+1) 上取整。
- 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的顺序对所有节点从0开始编号,则对于序号为i 的结点有:
若i>0,双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点 ;
若2i+1<n,左孩子序号:2i+1,否则无左孩子;
若2i+2<n,右孩子序号:2i+2,否则无右孩子;
二叉树的遍历
前序遍历
访问根结点——>根的左子树——>根的右子树
void preOrderTraversal(Node root){
if(root==null){
return;
}
System.out.print(root.value+" ");
preOrderTraversal(root.left);
preOrderTraversal(root.right);
}
中序遍历
根的左子树——>根结点——>根的右子树
void inOrderTraversal(Node root){
if(root==null){
return;
}
inOrderTraversal(root.left);
System.out.print(root.value+" ");
inOrderTraversal(root.right);
}
后序遍历
根的左子树——>根的右子树——>根节点
void postOrderTraversal(Node root){
if(root==null){
return;
}
postOrderTraversal(root.left);
postOrderTraversal(root.right);
System.out.print(root.value+" ");
}
层序遍历
自上而下,自左至右逐层访问树的结点。
void levelOrderTraversal(Node1 root){
if(root==null){
return;
}
Queue<Node1> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()){
Node1 cur = queue.poll();
System.out.print(cur.value+" ");
if(cur.left!=null){
queue.offer(cur.left);
}
if(cur.right!=null){
queue.offer(cur.right);
}
}
}