树
(Tree)是n(n>=0)个结点的有限集。n=0时称为空树。在任意一颗非空树中:
1)有且仅有一个特定的称为根(Root)的结点;
2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、…、Tn,其中每一个集合本身又是一棵树,并且称为根的子树。
结点的度
结点拥有的子树数目称为结点的度。
二叉树
二叉树是一个连通的无环图,并且每一个顶点的度不大于3。有根二叉树还要满足根结点的度不大于2。有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结点。
二叉树是递归定义的,其结点有左右子树之分,逻辑上二叉树有五种基本形态:
(1)空二叉树
无任何节点
(2)只有一个根结点的二叉树
(3)只有左子树
(4)只有右子树
(5)完全二叉树
完全二叉树特点:
叶子结点只能出现在最下一层(满二叉树继承而来)
最下层叶子结点一定集中在左 部连续位置。
倒数第二层,如有叶子节点,一定出现在右部连续位置。
同样结点树的二叉树,完全二叉树的深度最小(满二叉树也是对的)。
(6)满二叉树
所有的分支结点都存在左子树和右子树,并且所有的叶子结点都在同一层上
二叉树遍历
前序遍历:
先计算本节点,再递归遍历左树,再递归遍历右树
中序遍历:
先递归遍历左树,计算本节点,再递归遍历右树
后序遍历:
先递归遍历左树,再递归遍历右树,计算本节点
package com.gf;
import java.util.ArrayList;
import java.util.List;
public class TreeNode {
private String name = null;
private TreeNode leftNode = null;
private TreeNode rightNode = null;
public TreeNode(String name)
{
this.name =name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public TreeNode getLeftNode() {
return leftNode;
}
public void setLeftNode(TreeNode leftNode) {
this.leftNode = leftNode;
}
public TreeNode getRightNode() {
return rightNode;
}
public void setRightNode(TreeNode rightNode) {
this.rightNode = rightNode;
}
public static TreeNode initTree()
{
TreeNode root = new TreeNode("ROOT");
TreeNode leftA = new TreeNode("LeftA");
root.setLeftNode(leftA);
TreeNode rightB = new TreeNode("rightB");
root.setRightNode(rightB);
TreeNode leftA1 = new TreeNode("LeftA1");
leftA.setLeftNode(leftA1);
TreeNode leftA2 = new TreeNode("LeftA2");
leftA.setRightNode(leftA2);
TreeNode rightB1 = new TreeNode("rightB1");
rightB.setLeftNode(rightB1);
TreeNode rightB2 = new TreeNode("rightB2");
rightB.setRightNode(rightB2);
return root;
}
//前序遍历
public static void forwardIterate(TreeNode tn)
{
String name = tn.getName();
System.out.print(name+",");
TreeNode leftNode = tn.getLeftNode();
if(leftNode != null)
forwardIterate(leftNode);
TreeNode rightNode = tn.getRightNode();
if(rightNode != null)
forwardIterate(rightNode);
}
//中序遍历
public static void middleIterate(TreeNode tn)
{
TreeNode leftNode = tn.getLeftNode();
if(leftNode != null)
middleIterate(leftNode);
String name = tn.getName();
System.out.print(name+",");
TreeNode rightNode = tn.getRightNode();
if(rightNode != null)
middleIterate(rightNode);
}
//后序遍历
public static void lastIterate(TreeNode tn)
{
TreeNode leftNode = tn.getLeftNode();
if(leftNode != null)
lastIterate(leftNode);
TreeNode rightNode = tn.getRightNode();
if(rightNode != null)
lastIterate(rightNode);
String name = tn.getName();
System.out.print(name+",");
}
public static void main(String[] args)
{
TreeNode root = TreeNode.initTree();
forwardIterate(root);
System.out.println("\n===");
middleIterate(root);
System.out.println("\n===");
lastIterate(root);
}
}