(一)二叉树的性质
- 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1) (i>0)个结点。
- 若规定只有根节点的二叉树的深度为1,则深度为K的二叉树的最大结点数是2^k-1 (k>=0)。
- 对任何一棵二叉树, 如果其叶结点个数为 n0, 度为2的非叶结点个数为 n2,则有n0=n2+1。
- 具有n个结点的完全二叉树的深度k为log(n+1)上取整。
- 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的顺序对所有节点从0开始编号,则对于序号为i的结点有:
若i>0,双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点
若2i+1<n,左孩子序号:2i+1,否则无左孩子
若2i+2<n,右孩子序号:2i+2,否则无右孩子
(二)二叉树的基本操作
import java.util.*;
class Node {
public Node left;
public Node right;
public char val;
public Node(char val) {
this.val = val;
}
}
public class BinaryTree {
public static Node buildTree() {
Node A = new Node('A');
Node B = new Node('B');
Node C = new Node('C');
Node D = new Node('D');
Node E = new Node('E');
Node F = new Node('F');
Node G = new Node('G');
Node H = new Node('H');
A.left = B;
A.right = C;
B.left = D;
B.right = E;
C.left = F;
C.right = G;
E.right = H;
return A;
}
// 前序遍历 递归来实现
void preOrderTraversal(Node root){
if(root == null) {
return;
}
System.out.print(root.val+" ");
preOrderTraversal(root.left);
preOrderTraversal(root.right);
}
// 中序遍历
void inOrderTraversal(Node root){
if(root == null) {
return;
}
inOrderTraversal(root.left);
System.out.print(root.val+" ");
inOrderTraversal(root.right);
}
// 后序遍历
void postOrderTraversal(Node root){
if(root == null) {
return;
}
postOrderTraversal(root.left);
postOrderTraversal(root.right);
System.out.print(root.val+" ");
}
// 遍历思路-求结点个数
static int size;
void getSize1(Node root) {
if(root == null) {
return;
}
size++;
getSize1(root.left);
getSize1(root.right);
}
// 子问题思路-求结点个数
int getSize2(Node root) {
if(root == null) {
return 0;
}
return getSize2(root.left)+getSize2(root.right)+1;
}
// 遍历思路-求叶子结点个数
static int leafSize;
void getLeafSize1(Node root) {
if(root == null) {
return;
}
if(root.right == null && root.left == null) {
leafSize++;
}
getLeafSize1(root.left);
getLeafSize1(root.right);
}
// 子问题思路-求叶子结点个数
int getLeafSize2(Node 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(Node 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(Node root) {
if(root == null) {
return 0;
}
return Math.max(getHeight(root.left),getHeight(root.right))+1;
}
// 查找 val 所在结点,没有找到返回 null
// 按照 根 -> 左子树 -> 右子树的顺序进行查找
// 一旦找到,立即返回,不需要继续在其他位置查找
Node find(Node root, int val){
if(root == null) {
return null;
}
if(root.val == val) {
return root;
}
Node left = find(root.left,val);
if(left.val == val) {
return left;
}
Node right = find(root.right,val);
if(right.val == val ) {
return right;
}
return null;
}