手动构建二叉树要满足的基本功能:创建二叉树节点;存数据;取数据;
- 创建节点:
/**
* 二叉树的节点
*/
public class TreeNode {
private Integer data;
private TreeNode left;
private TreeNode right;
public TreeNode(Integer data) {
this.data = data;
}
public Integer getData() {
return data;
}
public void setData(Integer data) {
this.data = data;
}
public TreeNode getLeft() {
return left;
}
public void setLeft(TreeNode left) {
this.left = left;
}
public TreeNode getRight() {
return right;
}
public void setRight(TreeNode right) {
this.right = right;
}
}
- 利用节点添加有带有存储顺序的二叉树:
public class BinarySortTree {
private TreeNode root;
/**
* 添加数据
*该二叉树的数据结构:左节点<根<=右节点
*/
public boolean add(Integer data){
if(root == null){
this.root = new TreeNode(data);
}else{
TreeNode current = root;
TreeNode presentNode = null;
while(current!=null){
presentNode = current;
if(data<current.getData()){
current = current.getLeft();
if(current != null){
presentNode.setLeft(new TreeNode(data));
return true;
}
}else{
current = current.getRight();
if(current != null){
presentNode.setRight(new TreeNode(data));
return true;
}
}
}
}
return false;
}
public TreeNode getRoot() {
return root;
}
public void setRoot(TreeNode root) {
this.root = root;
}
/**
* 查找指定数据
*/
public TreeNode get(Integer key){
TreeNode temp = root;
while(temp!=null){
if(key<temp.getData()){
temp = temp.getLeft();
}else if(key>temp.getData()){
temp = temp.getRight();
}else
return temp;
}
return null;
}
}
- 功能的实现
public class MainTest {
public static void main(String[] args) {
/**
//存入数据
BinarySortTree tree = new BinarySortTree();
tree.add(3);
tree.add(1);
tree.add(7);
tree.add(2);
tree.add(5);
tree.add(6);
tree.add(4);
//打印数据
mid_print(tree.getRoot());
//左节点<根<=右节点的二叉树配合左根右的输出,输出的数据是排好顺序的;
//查找指定数据
TreeNode temp = tree.get(7);
if(temp!=null)
System.out.println("找到了");
else
System.out.println("未找到");
*/
//创建七个节点
TreeNode root = new TreeNode(1);
TreeNode node1 = new TreeNode(2);
TreeNode node2 = new TreeNode(3);
TreeNode node3 = new TreeNode(4);
TreeNode node4 = new TreeNode(5);
TreeNode node5 = new TreeNode(6);
TreeNode node6 = new TreeNode(7);
//将节点串成数
root.setLeft(node1);
root.setRight(node2);
node1.setLeft(node3);
node1.setRight(node4);
node2.setRight(node6);
node2.setLeft(node5);
//printByLayer(root);
//pre_print(root);
//mid_print(root);
//last_print(root);
}
/**
* 按广度遍历:按层打印
*/
public static void printByLayer(TreeNode root){
if(root == null){
return;
}
//创建一个队列,先进先出
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()){
//判断queue是否为null
TreeNode temp = queue.poll();
System.out.println(temp.getData());
if(temp.getLeft()!=null)
queue.add(temp.getLeft());
if(temp.getRight()!=null)
queue.add(temp.getRight());
}
}
/**
* 按深度遍历:前/先序遍历:根左右
*/
public static void pre_print(TreeNode root) {
if (root == null)
return;
System.out.println(root.getData());
if(root.getLeft()!=null){
pre_print(root.getLeft());
}
if(root.getRight()!=null){
pre_print(root.getRight());
}
}
/**
* 按深度遍历:中序遍历:左根右
*/
public static void mid_print(TreeNode root){
if(root == null)
return;
if(root.getLeft()!=null){
mid_print(root.getLeft());
}
System.out.println(root.getData());
if(root.getRight()!=null){
mid_print(root.getRight());
}
}
/**
* 按深度遍历:后续遍历:左右根
*/
public static void last_print(TreeNode root){
if(root==null)
return;
if(root.getLeft()!=null){
last_print(root.getLeft());
}
if (root.getRight()!=null){
last_print(root.getRight());
}
System.out.println(root.getData());
}
}