二叉树
二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个节点。
代码实现:
先创建一个树
class BinaryTree {
private HeroNode root;
public void setRoot(HeroNode root) {
this.root = root;
}
}
再创建树上的每个节点
class HeroNode{
private int no;
private String name;
//该树的左子节点
private HeroNode left;
//该数的右子节点
private HeroNode right;
//给出该树的构造器
public HeroNode(int no,String name){
this.no = no;
this.name = name;
}
public int getNo(){
return no;
}
public void setNo(int no){
this.no = no;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public HeroNode getLeft(){
return left;
}
public void setLeft(HeroNode left){
this.left = left;
}
public HeroNode getRight() {
return right;
}
public void setRight(HeroNode right) {
this.right = right;
}
@Override
public String toString() {
return "HeroNode{" +
"no=" + no +
", name='" + name + '\'' +
'}';
}
}
前序遍历
思路:前序遍历的顺序是先看根节点,再去找左子树进行递归,最后再找右子树进行递归
代码实现:
//前序遍历的方法(父节点+左节点+右节点)
public void preOrder(){
//先输出父节点
System.out.println(this);
//进行递归左子树前序遍历
if(this.left != null){
this.left.preOrder();
}
//进行递归右子树前序遍历
if(this.right != null){
this.right.preOrder();
}
}
中序遍历
思路:中序遍历的顺序是先看左子树进行递归,再看根节点,再看右子树进行递归
//中序遍历(左节点+父节点+右节点)
public void infixOrder(){
//进行递归左子树中序遍历
if(this.left != null){
this.left.infixOrder();
}
//输出父节点
System.out.println(this);
//进行递归右子树中序遍历
if(this.right != null){
this.right.infixOrder();
}
}
后序遍历
思路:后序遍历是先去看左子树,再看右子树,最后看根节点。
//后序遍历(左节点+右节点+父节点)
public void postOrder(){
//进行递归左子树中序遍历
if(this.left != null){
this.left.postOrder();
}
//进行递归右子树中序遍历
if(this.right != null){
this.right.postOrder();
}
//输出父节点
System.out.println(this);
}
(扩展)层序遍历LeetCode102
这里直接上代码: 层序遍历
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
//先创建1个队列来表示每层的TreeNode
Queue<TreeNode> queue = new LinkedList<>();
//统计所有层数的集合
List<List<Integer>> arr = new ArrayList<List<Integer>>();
if(root == null){
return new ArrayList<>();
}
//先将根节点root加进去
queue.add(root);
//只要当前的队列不为null
while(!queue.isEmpty()){
//获取当前层的个数
int size = queue.size();
//先new1个ArrayList来接收
List<Integer> list = new ArrayList<>();
//遍历当前层
for(int i = 0;i<size;i++){
//将当前的节点取出
TreeNode node = queue.poll();
list.add(node.val);
if(node.left != null){
queue.add(node.left);
}
if(node.right != null){
queue.add(node.right);
}
}
arr.add(list);
}
return arr;
}
}
总结
二叉树的前序遍历,后序遍历,中序遍历的前中后指的就是根节点遍历的位置不一样。