1.二叉树的实现
二叉树的实现要比普通树容易,因为其每个节点最多只有两个子节点
其实,二叉树的每个左右子节点仍是一颗二叉树,因此,我们可以使用递归的方式来定义二叉树,二叉树的实现代码如下
public class BinaryTreeNode {
private int data; //数据
private BinaryTreeNode leftChirld; //左孩子
private BinaryTreeNode rightChirld; //右孩子
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public BinaryTreeNode getLeftChirld() {
return leftChirld;
}
public void setLeftChirld(BinaryTreeNode leftChirld) {
this.leftChirld = leftChirld;
}
public BinaryTreeNode getRightChirld() {
return rightChirld;
}
public void setRightChirld(BinaryTreeNode rightChirld) {
this.rightChirld = rightChirld;
}
}
这种实现方式称之为二叉树的左右链表表示法,如图所示
1.1 二叉树的创建
创建二叉树,一般有两种情况:初始化一个根节点或者初始化一棵空二叉树。代码如下:
public class BinaryTree {
private BinaryTreeNode root;
//初始化二叉树
public BinaryTree(){}
public BinaryTree(BinaryTreeNode root){
this.root = root;
}
public void setRoot(BinaryTreeNode root){
this.root = root;
}
public BinaryTreeNode getRoot(){
return root;
}
}
2、二叉树的遍历
二叉树的遍历是按照一定的规律来顺序遍历各二叉树节点,使得每个节点都会被访问且仅访问一次。通常二叉树的遍历根据根节点的遍历次序分为:先根遍历、中根遍历、后根遍历。
2.1 先根遍历(PreOrder)
若二叉树为空,则退出,否则进行下面操作
- 访问根节点
- 先根遍历左子树
- 先根遍历右子树
- 退出
按照先根遍历地方式,遍历如下二叉树,则访问顺序为:A、B、D、H、I、E、J、C、F、G
public void PreOrder(BinaryTreeNode node){
if(node!=null){
System.out.println(node.getData()); //先访问根节点
PreOrder(node.getLeftChirld()); //先根遍历左子树
PreOrder(node.getRightChirld()); //先根遍历右子树
}
}
2.2 中根遍历(InOrder)
若二叉树为空,则退出,否则进行下面操作
- 中根遍历左子树
- 访问根节点
- 中根遍历右子树
- 退出
按照中根遍历地方式,遍历如下二叉树,则访问顺序为:H、D、I、B、J、E、A、F、C、G
public void InOrder(BinaryTreeNode node){
if(node!=null){
InOrder(node.getLeftChirld()); //中根遍历左子树
System.out.println(node); //访问根节点
InOrder(node.getRightChirld()); //中根遍历右子树
}
}
2.3 后根遍历(PostOrder)
若二叉树为空,则退出,否则进行下面操作
- 后根遍历左子树
- 后根遍历右子树
- 访问根节点
- 退出
按照后根遍历地方式,遍历如下二叉树,则访问顺序为:H、I、D、J、E、B、F、G、C、A
public void PostOrder(BinaryTreeNode node){
if(node!=null){
PostOrder(node.getLeftChirld()); //后根遍历左子树
PostOrder(node.getRightChirld()); //后根遍历右子树
System.out.println(node); //访问根节点
}
}
}