二叉树的基本概念
- 节点的度:节点所拥有子树的个数称为该节点的度
- 叶节点:没有孩子的节点,也就是度为0的节点,也称终端节点
- 分支节点:度不为0的节点,一棵树中不是叶节点就是分支节点。
- 节点的层数:树的根节点的层数为1,其他的依次递增。
- 树的深度:一棵树的最大层数。
- 树的度:树中节点的最大层数就是该树的度。
- 满二叉树(也称为完美二叉树):每个分支节点都有左右孩子,且所有的叶子节点都在同一层。
- 完全二叉树:叶子节点只能出现在最下层或次下层。且最下层的叶子节点只能在树的左边。
注:满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树
二叉树的基本性质
- 一颗非空二叉树的第i层上面最多有2i-1个节点(i>=0)
- 一棵深度为k的二叉树最多有2k-1个节点。最少有K个节点
- 对于一个非空的数,度为0的节点数总比度为2的节点数多1。因为n=n1+n2+n0=n1+2*n2+1---->n0=n2+1。
- 具有n个节点的完全二叉树的深度为log2n+1
- 具有n个节点的数中,一共有n-1条 边,除了根节点以外,其他节点都有一条入边。
二叉树代码
public class Node {
public int data;
public Node left;
public Node right;
public Node(int data) {
this.data = data;
this.left = null;
this.right = null;
}
}
将数据插入有序二叉树
采用中序遍历,从小到大遍历,左子树最小;
获取当前节点,如果数据大于当前节点,就放在右子树上,如果右子树不为空,则继续向下找。
public void insert(int data,Node root){
Node newNode = new Node(data);
if(root==null){
root = newNode;
}else {
Node current = root;
Node parent;
while (true){
parent=current;
if(data<current.data){
current=current.left;
if(current==null){
parent.left=newNode;
return;
}
}else {
current=current.right;
if(current==null){
parent.right=newNode;
return;
}
}
}
}
}
递归方法实现遍历
/*
中序遍历
*/
public void inOrder(Node root){
if(root!=null){
inOrder(root.left);
System.out.print(root.data+" ");
inOrder(root.right);
}
}
/*
先序遍历
*/
public void preOrder(Node root){
if(root !=null){
System.out.print(root.data+" ");
preOrder(root.left);
preOrder(root.right);
}
}
/*
后序遍历
*/
public void postOrder(Node root){
if(root!=null){
postOrder(root.left);
preOrder(root.right);
System.out.print(root.data+" ");
}
}