1、概念
一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。
二叉树的特点:
a. 每个结点最多有两棵子树,即二叉树不存在度大于 2 的结点。
b. 二叉树的子树有左右之分,其子树的次序不能颠倒
2、二叉树的基本形态(5种)
3、两种特殊的二叉树(满二叉树、完全二叉树)
a. 完全二叉树: 完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树
b. 满二叉树: 一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树
4、二叉树的遍历
所谓先序、中序、后序都是相对根节点
a. 前序遍历/先序遍历:根左右
b. 中序遍历:左跟右
c. 后序遍历:左右跟
d. 层次遍历:自上至下,自左至右遍历树的每一个结点
e. 一个简单的示例
5、二叉树的基本操作
class Node{
public char val;
public Node left;
public Node right;
public Node(char val){
this.val = val;
}
}
public class Tree {
//构造一棵二叉树
public static Node built(){
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;
e.left = g;
g.right = h;
c.right = f;
return a;
}
//先序遍历二叉树
public static void preOrder(Node root){
if(root == null){
return;
}
System.out.print(root.val);
preOrder(root.left);
preOrder(root.right);
}
//中序遍历二叉树
public static void inOrder(Node root){
if(root == null){
return;
}
preOrder(root.left);
System.out.print(root.val);
preOrder(root.right);
}
//后序遍历二叉树
public static void postOrder(Node root){
if(root == null){
return;
}
preOrder(root.left);
preOrder(root.right);
System.out.print(root.val);
}
//求二叉树中节点的个数
public static int size(Node root){
if(root == null){
return 0;
}
return 1+size(root.left)+size(root.right);
}
//求二叉树中叶子节点的个数
public static int leafSize(Node root){
if(root == null){
return 0;
}
if(root.left == null && root.right == null){
return 1;
}
return leafSize(root.left) + leafSize(root.right);
}
//在二叉树中查找指定元素
public static Node find(Node root,char toFind){
if(root == null){
return null;
}
if(root.val == toFind){
return root;
}
Node result = find(root.left,toFind);
if(result != null){
return result;
}
return find(root.right,toFind);
}
//求二叉树第K层的结点个数
public static int kLevelSize(Node root, int k){
if(root == null || k<1){
return 0;
}
if(k == 1){
return 1;
}
return kLevelSize(root.left,k-1)+kLevelSize(root.right,k-1);
}
public static void main(String[] args) {
Node root = built();
System.out.println("先序遍历: ");
preOrder(root);
System.out.println();
System.out.println("中序遍历: ");
inOrder(root);
System.out.println();
System.out.println("后序遍历: ");
postOrder(root);
System.out.println();
System.out.println("求二叉树中节点的个数");
System.out.println(size(root));
System.out.println();
System.out.println("求二叉树中第K层节点的个数");
System.out.println(kLevelSize(root,3));
System.out.println();
System.out.println("求二叉树中叶子节点的个数");
System.out.println(leafSize(root));
System.out.println();
System.out.println("求二叉树中指定元素D");
System.out.println(find(root,'D'));
}
}