文章目录
二叉树
二叉树的定义
二叉树(Binary Tree)
二叉树(Binary Tree)是有限个节点的集合,这个集合可以是空集,也可以是一个根节点和两颗不相交的子二叉树组成的集合,其中一颗树叫根的左子树,另一颗树叫右子树。所以二叉树是一个递归地概念。
满二叉树(Full Binary Tree)
一棵满二叉树就是高度为k,且拥有(2^k)-1
个节点的二叉树,一棵满二叉树每个节点,要么都有两棵子树,要么都没有子树;而且每一层所有的节点之间必须要么都有两棵子树,要么都没子树。
完全二叉树(Complete Binary Tree)
完全二叉树是一颗特殊的二叉树,假设完全二叉树高度为k,则完全二叉树需要符合以下两点:
- 所有叶子节点都出现在k层或k-1层,并且从1~k-1层必须达到最大节点数
- 第k层可以是不满的,但是第k层的所有节点必须集中在最左边
二叉树的实现
二叉树的左右链表表示法:
![二叉树的左右链表表示法](https://tva1.sinaimg.cn/large/007S8ZIlgy1gf4f6hekj3j30m80bvab1.jpg)
public class BinaryTreeNode {
private int data; //数据
private BinaryTreeNode leftChild ; //左孩子
private BinaryTreeNode rightChild ; //右孩子
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public BinaryTreeNode getLeftChild () {
return leftChild ;
}
public void setLeftChild (BinaryTreeNode leftChild ) {
this.leftChild = leftChild ;
}
public BinaryTreeNode getRightChild () {
return rightChild ;
}
public void setRightChild (BinaryTreeNode rightChild ) {
this.rightChild = rightChild ;
}
}
二叉树的操作
遍历
先根遍历(Pre Order)
若二叉树为空,则退出,否则进行下面操作:
- 访问根节点
- 先根遍历左子树
- 先根遍历右子树
- 退出
public void PreOrder(BinaryTreeNode node){
if(node != null){
System.out.println(node.getData()); //先访问根节点
PreOrder(node.getLeftChild ()); //先根遍历左子树
PreOrder(node.getRightChild ()); //先根遍历右子树
}
}
中根遍历(In Order)
若二叉树为空,则退出,否则进行下面操作
- 中根遍历左子树
- 访问根节点
- 中根遍历右子树
- 退出
public void InOrder(BinaryTreeNode node){
if(node != null){
InOrder(node.getLeftChild()); //中根遍历左子树
System.out.println(node.getData()); //访问根节点
InOrder(node.getRightChild()); //中根遍历右子树
}
}
后根遍历(Post Order)
若二叉树为空,则退出,否则进行下面操作
- 后根遍历左子树
- 后根遍历右子树
- 访问根节点
- 退出
public void PostOrder(BinaryTreeNode node){
if(node != null){
PostOrder(node.getLeftChild()); //后根遍历左子树
PostOrder(node.getRightChild()); //后根遍历右子树
System.out.println(node.getData()); //访问根节点
}
}
层次遍历(Level Traverse)
public void levelTraverse(BinaryTreeNode root) {
if (root == null) {
return;
}
LinkedList<BinaryTreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty())