树
树的概念和常用术语
常用术语
-
节点
-
根节点
-
父节点
-
子节点
-
叶子节点:没有子节点的节点
-
节点的权:节点的值
-
路径:节点A到节点B的路径
-
层
-
子树
-
树的高度:最大层数
-
森林:多颗子树构成森林
二叉树概念
-
每个节点最多只有两个子节点的树,叫二叉树
-
若该二叉树是满二叉树,节点数是2^n - 1,n为层数
-
完全二叉树:每一层节点都是连续的,即有子节点的父节点都有两个子节点
建立二叉树
思路分析
-
建立节点类
-
包含信息,左孩子指针,右孩子指针
二叉树的前中后序遍历算法
前序遍历
前序遍历
-
先输出父节点,再遍历左子树和右子树
-
中,左,右
思路分析
-
先输出当前节点,初始是root节点
-
如果左子节点不为空,则递归继续前序遍历
-
如果右子节点不为空,则递归继续前序遍历
中序遍历
中序遍历
-
先遍历左子树,在输出父节点,再遍历右子树
-
左,中,右
思路分析
-
如果左子节点不为空,则递归继续中序遍历
-
输出当前节点
-
如果右子节点不为空,则递归继续中序遍历
后序遍历
后序遍历
-
先遍历左子树,再遍历右子树,最后输出父节点
-
左,右,中
思路分析
-
如果左子节点不为空,则递归继续中序遍历
-
如果右子节点不为空,则递归继续中序遍历
-
输出当前节点
代码实现
package com.why.tree;
import java.sql.SQLOutput;
/**
* @Description TODO 前中后序遍历
* @Author why
* @Date 2020/11/4 16:49
* Version 1.0
**/
public class BinaryTreeDemo {
public static void main(String[] args) {
//创建二叉树
BinaryTree binaryTree = new BinaryTree();
//创建需要的节点
BNode root = new BNode(1,"why");
BNode node1 = new BNode(1,"cjl");
BNode node2 = new BNode(1,"wl");
BNode node3 = new BNode(1,"lrx");
//手动创建二叉树,后边以递归方式建立二叉树
root.setLeftChild(node1);
root.setRightChild(node2);
node2.setRightChild(node3);
//设置根节点
binaryTree.setRoot(root);
System.out.println("前序遍历:");
binaryTree.preOrder();
System.out.println();
System.out.println("中序遍历:");
binaryTree.midOrder();
System.out.println();
System.out.println("后序遍历:");
binaryTree.postOrder();
}
}
/**
* 定义二叉树
*/
class BinaryTree{
private BNode root;
public BNode getRoot() {
return root;
}
public void setRoot(BNode root) {
this.root = root;
}
/**
* 前序遍历
*/
public void preOrder(){
if (this.root != null){
this.root.preOrder();
}else {
System.out.println("二叉树为空");
}
}
/**
* 中序遍历
*/
public void midOrder(){
if (this.root != null){
this.root.midOrder();
}else {
System.out.println("二叉树为空");
}
}
/**
* 后序遍历