一、树(难点)
1.层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推。
树的层次是4。
2.树的高度和深度
高度:从该节点到叶子节点的最长简单路径边的条数。(路径条数+1或节点的个数(包括自身节点))
深度:从根节点到该节点的最长简单路径边的条数。
二、二叉树
1.概念:一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉
树组成。
二叉树的特点:
(1)每个结点最多有两棵子树,即二叉树不存在度大于 2 的结点。
(2) 二叉树的子树有左右之分,其子树的次序不能颠倒,因此二叉树是有序树。
2.二叉树的性质
(1)根节点的层数为1,则一棵非空二叉树的第i层上最多有 2^(i-1) (i>0)个结点
(2)只有根节点的二叉树的深度为1,则深度为K的二叉树的最大结点数是 2^k-1 (k>=0)
(3)叶结点个数为 n0, 度为2的非叶结点个数为 n2,则有n0=n2+1
(4)n个结点的完全二叉树的深度k为 log2(n+1) 上取整
(5)根节点序号为0,对于一个序号为i的节点:
父亲节点是:(i-1)/2
左孩子节点:2i+1
右孩子节点: 2i+2
3.二叉树的存储方式:
(1)顺序存储:多用于完全二叉树
(2)类似于链表的链式存储:应用于任何树
4.二叉树的遍历方式:
(1)前序遍历
(2)中序遍历
(3)后序遍历
(4)层序遍历
5.二叉树的基本操作:
// 前序遍历
void preOrderTraversal(BTNode root) {
if (root == null) return;
System.out.print(root.val);
preOrderTraversal(root.left);
preOrderTraversal(root.right);
}
// 中序遍历
void inOrderTraversal(BTNode root) {
if (root == null) return;
inOrderTraversal(root.left);
System.out.print(root.val);
inOrderTraversal(root.right);
}
// 后序遍历
void postOrderTraversal(BTNode root) {
if (root == null) return;
postOrderTraversal(root.left);
postOrderTraversal(root.right);
System.out.print(root.val);
}
// 遍历思路-求结点个数
static int size = 0;
void getSize1(BTNode root) {
if (root == null) return;
size++;
getSize1(root.left);
getSize1(root.right);
}
// 子问题思路-求结点个数
int getSize2(BTNode root) {
if (root == null) return 0;
return getSize2(root.left)+getSize2(root.right)+1;
}
// 遍历思路-求叶子结点个数
static int leafSize = 0;
void getLeafSize1(BTNode root) {
if (root == null) return;
if (root.left == null && root.right == null) {
leafSize++;
}
getLeafSize1(root.left);
getLeafSize1(root.right);
}
// 子问题思路-求叶子结点个数
int getLeafSize2(BTNode root) {
if (root == null) return 0;
if (root.left==null && root.right==null) {
return 1;
}
return getLeafSize2(root.left)+getLeafSize2(root.right);
}
// 子问题思路-求第 k 层结点个数
int getKLevelSize(BTNode root,int k) {
if (root == null) return 0;
if (k == 1) {
return 1;
}
return getKLevelSize(root.left,k-1)+getKLevelSize(root.right,k-1);
}
// 获取二叉树的高度
int getHeight(BTNode root) {
if (root == null) return 0;
int leftHeight = getHeight(root.left);
int rightHeight = getHeight(root.right);
return leftHeight>rightHeight?leftHeight+1:rightHeight+1;
}
// 查找 val 所在结点,没有找到返回 null
// 按照 根 -> 左子树 -> 右子树的顺序进行查找
// 一旦找到,立即返回,不需要继续在其他位置查找
BTNode find(BTNode root, char val) {
if (root == null) return null;
if (root.val == val) {
return root;
}
BTNode ret = find(root.left,val);
if (ret != null) {
return ret;
}
ret = find(root.right,val);
if (ret != null) {
return ret;
}
return null;
}
6.创建二叉树:
class TreeNode {
public char val;
public TreeNode left;
public TreeNode right;
public TreeNode(char val) {
this.val = val;
}
}
public class Main {
private static int i = 0;
//创建二叉树
public static TreeNode createTree(String str) {
TreeNode root = null;
if(str.charAt(i) != '#') {
root = new TreeNode(str.charAt(i));
i++;
root.left = createTree(str);
root.right = createTree(str);
} else {
i++;
}
return root;
}
}