二叉树
树的每个节点最多有两个孩子节点
存储
顺序存储
一个节点编号i,它的双亲i/2,左孩子2i,右孩子2i+1
链式存储
遍历
先序遍历:根左右
中序遍历:左根右
后续遍历:左右根
构建遍历代码:
//
//二叉树节点是个静态类
private static class TreeNode{
int data;//数据域
TreeNode leftChild;//左孩子
TreeNode rightChild;//右孩子
}
//构建二叉树
//传入一个集合序列,LinkedList适合插入数据,频繁删除数据,每次存入数据后都要删除存入的数据
public static TreeNode creatBinaryTree(LinkedList<Integer> inputList)
{
TreeNode node=null;
if(inputList==null||inputList.isEmpy()) //因为如果inputList为空就不能调用该对象的方法,所以zhi一般是先判断不为null然后在判断该集合里面是不是有元素
{
return null;//存储结束,返回NULL
}
int data=inputList.removeFirst();//移除第一个元素,并拿到他
if(data!=null)//有数据
{
node.data=data;//存入数据
node.leftChild=creatBinaryTree(inputList);//去掉首元素的集合
node.rightChild=creatBinaryTree(inputList);//去掉首元素的集合
}
}
//先序遍历
public void preOrder(TreeNode node)
{
if(node=null){ //节点空,遍历结束
return ; //无返回值void
}
System.out.println(node.data);//输出数据,遍历根
preOrder(node.leftChild);//遍历左孩子
preOrder(node.rightChild);//遍历右孩子
}
//注意:data不用再判断,因为空也可以输出,前面构造二叉树时,data=null时,也存入了
//中序遍历
public void inOrder(TreeNode node)
{
if(node=null){ //节点空,遍历结束
return ; //无返回值void
}
inOrder(node.leftChild);//遍历左孩子
System.out.println(node.data);//输出数据,遍历根
inOrder(node.rightChild);//遍历右孩子
}
//后序遍历
public void postOrder(TreeNode node)
{
if(node=null){ //节点空,遍历结束
return ; //无返回值void
}
postOrder(node.leftChild);//遍历左孩子
postOrder(node.rightChild);//遍历右孩子
System.out.println(node.data);//输出数据,遍历根
}
//主函数
public static void main(String[] args)
{
LinkedList<Integer> inputList=new LinkedList<Intsger>(
Arrays.asList(new Integer[]{3,2,9,null,null,10,null,null,8,null,null,4})
);
TreeNode treeNode =creatBinaryTree(inputList);
System.out.println(先序遍历);
preOrder(inputList);
System.out.println(中序遍历);
inOrder(inputList);
System.out.println(后序遍历);
postOrder(inputList);
}
要点
定义:三成员
创建:传集合、两判断
判断一:集合为null,返回null.
判断二:元素为null,返回node
遍历:判节点
节点为null,结束一个节点遍历
单词
Child 孩子
preOrder 先序遍历
inOrder 中序遍历
postOrder 后序遍历
createBinaryTree 构建二叉树