二叉树的分类和比较
二叉树的分类
满二叉树
所有叶子节点都在同一层 所有分支节点(非叶子节点)都有左右子树
每一层的节点个数 (i表示层数) 2^(i-1)个节点
对于深度为h的树,共有节点 2^h - 1
斜树
所有的子节点都向一个方向倾斜,只分叉出左子树或右子树
完全二叉树
对于高度/深度为h的二叉树而言,h-1层都是满的,h层节点在左侧连续排列,空位都在右侧。
满二叉树一定是完全二叉树,反之未必。
将完全二叉树的节点进行编号,对于编号为k的节点:
1) 父节点就是 k/2
2) 如果有孩子节点,先有左孩子 2k,后有右孩子 2k+1
【构造出完全二叉树】
// 0 1 2 3 4
// 2k+1 2k+2
private static int[] array = {1, 2, 3, 4, 5};
// 存储生成的节点
private static List<TreeNode> nodeList = new LinkedList<>();
public static TreeNode createTree() {
// 构造节点
for (int i = 0; i < array.length; i++) {
TreeNode node = new TreeNode(array[i]);
nodeList.add(node);
}
// 构造节点之间的关系
for (int i = 0; i < nodeList.size() / 2; i++) {
TreeNode node = nodeList.get(i);
node.left = nodeList.get(i * 2 + 1);
// 最后一个父节点 可能没有右孩子 需要额外判断
if (i * 2 + 2 < nodeList.size()) {
node.right = nodeList.get(i * 2 + 2);
}
}
return nodeList.get(0);
}
【相同的树】
https://leetcode-cn.com/problems/same-tree/
- 相同的树
给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
输入: 1 1
/ \ /
2 3 2 3[1,2,3], [1,2,3]
输出: true
示例 2:输入: 1 1
/
2 2[1,2], [1,null,2]
输出: false
示例 3:输入: 1 1
/ \ /
2 1 1 2[1,2,1], [1,1,2]
输出: false
如何判断是否相同?
1)两棵树,如果有左右子树,树A的左子树树B的左子树,同时树A的右子树树B的右子树
2)如果两棵树都是空,是相同的
3)如果一棵为空,一棵不为空,是不同的
4)如果数值不同,也是不同的
public boolean isSameTree(TreeNode p, TreeNode q) {
// 递归出口
if (p == null && q == null) {
return true;
}
if (p == null || q == null) {
return false;
}
if (p.val != q.val) {
return false;
}
// 递归规律
return isSameTree(p.left, q.left)
&& isSameTree(p.right, q.right);
}