数据结构_二叉树(复习)
()内为理解方法和注释
二叉树
每个节点的度最大为2(最多拥有两个子树)
补充:
树的深度:也称为树的高度
结点的度:一个结点拥有子树的数目称为结点的度
类型
-
满二叉树: 深度为k的二叉树 其结点总数最多为2^k-1
-
完全二叉树:最后一层 从左到右 连续缺少若干个结点
*注:满二叉树一定是完全二叉树,但完全二叉树不一定是满二叉树。
二叉树的性质
- 在二叉树中第 i 层的结点数最多为2^(i-1)(i ≥ 1)
- 高度为k的二叉树其结点总数最多为2^k-1( k ≥ 1)
-
n0 = n2 + 1
(叶结点为 n0,而其度为 2 的结点数为 n2)
-
n=n0+n1+n2
( n是总结点数,因为度的数一共就这3种情况 )
-
n0=n2+1= (n/2 向上取整)
-
n=1+n1+2n2
(1代表根,然后统计各个子树的数目。不断加进去)
二叉树的先序遍历(Java)
数组储存二叉树对于索引为K的节点,其左孩子为(2K) 右孩子为( 2K+1)
public class TreeNode {
int value;
TreeNode left;
TreeNode right;
TreeNode(int value, TreeNode right, TreeNode left)
{
this.value = value;
this.right = right;
this.left = left;
}
}
public class PreOrderTest {
public static void main(String[] args) {
TreeNode[] nodes = new TreeNode[10];
//初始化了这个类型的数组
for (int i = 0; i < 10; i++) { //初始化这个数组里的给个对象
nodes[i] = new TreeNode(i, null, null);
}
for (int i = 0; i < 10; i++) {
//对于索引为K=1 开始的节点,其左孩子为(2*K) 右孩子为( 2*K+1)
//i=0 开始
if (i * 2 + 1 < 10) {
//如果有左孩子
nodes[i].left = nodes[i * 2 + 1];
}
if (i * 2+2 < 10) {
// 如果有右孩子
nodes[i].right = nodes[i * 2+2];
}
}
preOrderRe(nodes[0]);
}
public static void preOrderRe(TreeNode treeNode) {
System.out.print(treeNode.value);
if (treeNode.left != null) {
preOrderRe(treeNode.left);
}
if (treeNode.right != null) {
preOrderRe(treeNode.right);
}
}
}