二叉树
由一个由有限节点所组成的集合,此集合可以为空集合,或由一个树根及左右两个子树所组成。简单地说,二叉树最多只能有两个子节点,就是度小于或等于2。
形态:
特殊二叉树:
1.满二叉树
如果二叉树的高度为h(h>=0),树的节点为2^h-1,则称之为满二叉树(即除叶节点外的所有节点都有两个子节点)。
2.完全二叉树
假设二叉树的深度h
节点数小于2^h-1
节点的编号方式如同深度为h的满二叉树
从左到右,从上到下顺序一一对应
(除最后一层(叶节点)外,其它各层的节点树都达到最大个数,且最后一层从左向右的叶节点连续存在,只缺右侧若干节点)
一、性质
1.在二叉树的第n层上至多有2^n-1个节点
2.深度为K的二叉树至多有2^K-1个节点
3.具有n个节点的完全二叉树的深度K为:K = log(2^n)+1
二、遍历
1.前序遍历
递归:
public void preOrder(Node root) {
if(root==null) return;
System.out.print(root.date+" ");
preOrder(root.left);
preOrder(root.right);
}
迭代:
public void preOrder(Node root) {
if(root==null) return;
Stack<Node> stack=new Stack<BST.Node>(); //用栈来完成
stack.push(root);
while(!stack.isEmpty()) {
Node temp=stack.pop();
System.out.print(temp.date+" ");
if(temp.right!=null) { //先右节点如栈
stack.push(temp.right);
}
if(temp.left!=null) { //左节点入栈
stack.push(temp.left);
}
}
}
2.中序遍历
递归:
public void inOrder(Node root) {
if(root==null) return;
if(root.left!=null) inOrder(root.left);
System.out.print(root.date+" ");
if(root.right!=null) inOrder(root.right);
}
迭代:
public void inOrder(Node root) {
if(root==null) return;
Node temp=root;
Stack<Node> stack=new Stack<BST.Node>();
while(temp!=null||!stack.isEmpty()) {
while(temp!=null) { //先将最左边的节点入栈
stack.push(temp);
temp=temp.left;
}
if(!stack.isEmpty()) {
temp=stack.pop();
System.out.print(temp.date+" ");
temp=temp.right;
}
}
}
3.后序遍历
递归:
public void postOrder(Node root) {
if(root==null) return;
if(root.left!=null) postOrder(root.left);
if(root.right!=null) postOrder(root.right);
System.out.print(root.date+" ");
}
4.层序遍历
public void winthOrder(Node root) {
Queue<Node> queue=new LinkedList<BST.Node>(); //队列实现
if(root==null) return;
queue.add(root);
while(!queue.isEmpty()) {
Node t=queue.poll();
System.out.print(t.date+" ");
if(t.left!=null) {
queue.offer(t.left);
}
if(t.right!=null) {
queue.offer(t.right);
}
}
}