java 建树_解析Java实现二叉树前序建树,前中后递归非递归遍历及层序遍历

Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】

本文实例讲述了Java实现的二叉树常用操作。分享给大家供大家参考,具体如下:

import java.util.ArrayDeque;

import java.util.Queue;

import java.util.Stack;

//二叉树的建树,前中后 递归非递归遍历 层序遍历

//Node节点

class Node {

int element;

Node left;

Node right;

public Node() {

}

public Node(int element) {

this.element = element;

}

}

// BinaryTree

public class Tree {

// creat tree from array

public static Node creatTree(int[] data, int i) {

if (i >= data.length || data[i] == -1)

return null;

Node temp = new Node(data[i]);

temp.left = creatTree(data, i * 2 + 1);

temp.right = creatTree(data, i * 2 + 2);

return temp;

}

// pre前序遍历递归

public static void pre(Node temp) {

if (temp == null)

return;

System.out.print(temp.element + " ");

pre(temp.left);

pre(temp.right);

}

// mid中序遍历递归

public static void mid(Node temp) {

if (temp == null)

return;

mid(temp.left);

System.out.print(temp.element + " ");

mid(temp.right);

}

// last后序遍历递归

public static void last(Node temp) {

if (temp == null)

return;

last(temp.left);

last(temp.right);

System.out.print(temp.element + " ");

}

// pre1前序遍历非递归

public static void pre1(Node temp) {

Stack stack = new Stack<>();

while (temp != null || !stack.isEmpty()) {

while (temp != null) {

stack.push(temp);

System.out.print(temp.element + " ");

temp = temp.left;

}

if (!stack.isEmpty()) {

temp = stack.pop().right;

}

}

}

// mid1中序遍历非递归

public static void mid1(Node temp) {

Stack stack = new Stack<>();

while (temp != null || !stack.isEmpty()) {

while (temp != null) {

stack.push(temp);

temp = temp.left;

}

if (!stack.isEmpty()) {

temp = stack.pop();

System.out.print(temp.element + " ");

temp = temp.right;

}

}

}

// last1后序遍历非递归

public static void last1(Node temp) {

Stack stack = new Stack<>();

Stack stack2 = new Stack<>();

while (temp != null || !stack.isEmpty()) {

while (temp != null) {

stack.push(temp);

stack2.push(temp);

temp = temp.right;

}

if (!stack.isEmpty()) {

temp = stack.pop().left;

}

}

while (!stack2.isEmpty())

System.out.print(stack2.pop().element + " ");

}

// ceng层序遍历

public static void ceng(Node temp) {

if (temp == null)

return;

Queue queue = new ArrayDeque<>();

queue.offer(temp);

while (!queue.isEmpty()) {

temp = queue.poll();

System.out.print(temp.element + " ");

if (temp.left != null)

queue.offer(temp.left);

if (temp.right != null)

queue.offer(temp.right);

}

}

// Demo

public static void main(String[] args) {

int[] array = { 1, 2, 3, 4, 5, 6, 7, -1, -1, 10, -1, -1, 13 };

Node tree = creatTree(array, 0);

System.out.println("码农之家测试结果:");

pre(tree);

System.out.println();

pre1(tree);

System.out.println();

mid(tree);

System.out.println();

mid1(tree);

System.out.println();

last(tree);

System.out.println();

last1(tree);

System.out.println();

ceng(tree);

}

}

运行结果:

494a07733be089da511541d15c09ebc6.png

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值