当前位置 博文首页 > fareast_mzh的博客:Binary Tree 非递归方式实现二叉树先序遍历
节点数据类型声明 Node.java
package com.merrytech;
public class Node implements Comparable {
private Comparable value;
private Node left;
private Node right;
public Node(Comparable value) {
this.value = value;
this.left = null;
this.right = null;
}
public Comparable getValue() { return this.value; }
@Override
public int compareTo(Object o) {
Node n = (Node)o;
return this.value.compareTo(n.getValue());
}
public Node getLeft() { return this.left; }
public Node getRight() { return this.right; }
public void setLeft(Node left) { this.left = left; }
public void setRight(Node right) { this.right = right; }
}
二叉查找树 BinarySearchTree.java
package com.merrytech;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
public class BinarySearchTree implements Comparable {
private Node root;
public BinarySearchTree() {
this.root = null;
}
public int compareTo(Object n) {
Node node = (Node)n;
return this.root.compareTo(node);
}
public void insert(Comparable key) {
Node newNode = new Node(key);
if (this.root == null) {
this.root = newNode;
} else {
BinarySearchTree.insertNode(this.root, newNode);
}
}
private static void insertNode(Node node, Node newNode) {
if (newNode.compareTo(node) < 0) {
if (node.getLeft() == null) {
node.setLeft(newNode);
} else {
BinarySearchTree.insertNode(node.getLeft(), newNode);
}
} else {
if (node.getRight() == null) {
node.setRight(newNode);
} else {
BinarySearchTree.insertNode(node.getRight(), newNode);
}
}
}
/**
* 按层级遍历
* @param fn Handler
*/
public void levelTraverse(Handler fn) {
Queue<Node> q = new LinkedList<>();
q.add(this.root);
while (!q.isEmpty()) {
Node front = q.remove();
fn.handle(front.getValue());
if (front.getLeft() != null) {
q.add(front.getLeft());
}
if (front.getRight() != null) {
q.add(front.getRight());
}
}
}
public void preOrderTraverse(Handler fn) {
BinarySearchTree.preOrderReCur(this.root, fn);
System.out.println();
BinarySearchTree.preOrderNotRecur(this.root, fn);
System.out.println();
}
private static void preOrderReCur(Node node, Handler fn) {
if (node != null) {
fn.handle(node.getValue());
BinarySearchTree.preOrderReCur(node.getLeft(), fn);
BinarySearchTree.preOrderReCur(node.getRight(), fn);
}
}
private static void preOrderNotRecur(Node head, Handler fn) {
if (head != null) {
Stack<Node> stack = new Stack<Node>();
stack.add(head);
while (!stack.isEmpty()) {
head = stack.pop();
fn.handle(head.getValue());
if (head.getRight() != null) {
stack.push(head.getRight());
}
if (head.getLeft() != null) {
stack.push(head.getLeft());
}
}
}
}
public void inOrderTraverse(Handler fn) {
// BinarySearchTree.inOrderRecur(this.root, fn);
BinarySearchTree.inOrderNotRecur(this.root, fn);
System.out.println();
}
/**
* 中序遍历
* @param node Node
* @param fn Handler
*/
private static void inOrderRecur(Node node, Handler fn) {
if (node != null) {
BinarySearchTree.inOrderRecur(node.getLeft(), fn);
fn.handle(node.getValue());
BinarySearchTree.inOrderRecur(node.getRight(), fn);
}
}
private static void inOrderNotRecur(Node head, Handler fn) {
if (head != null) {
Stack<Node> stack = new Stack<Node>();
while (!stack.isEmpty() || head != null) {
if (head != null) {
stack.push(head);
head = head.getLeft();
} else {
head = stack.pop();
fn.handle(head.getValue());
head = head.getRight();
}
}
}
}
public void posOrderTraverse(Handler fn) {
// BinarySearchTree.posOrderRecur(this.root, fn);
BinarySearchTree.posOrderNotRecur(this.root, fn);
}
private static void posOrderRecur(Node node, Handler fn) {
if (node != null) {
BinarySearchTree.posOrderRecur(node.getLeft(), fn);
BinarySearchTree.posOrderRecur(node.getRight(), fn);
fn.handle(node.getValue());
}
}
private static void posOrderNotRecur(Node head, Handler fn) {
if (head != null) {
Stack<Node> s1 = new Stack<Node>();
Stack<Node> s2 = new Stack<Node>();
s1.push(head);
while (!s1.isEmpty()) {
head = s1.pop();
s2.push(head);
if (head.getLeft() != null) {
s1.push(head.getLeft());
}
if (head.getRight() != null) {
s1.push(head.getRight());
}
}
while(!s2.isEmpty()) {
fn.handle(s2.pop().getValue());
}
}
}
}
Handler.java? 遍历节点 操作函数接口
package com.merrytech;
public class Handler {
public void handle(Object o) {
System.out.print(o + " ");
}
}
HelloWorld.java 主类
package com.merrytech;
public class Main {
public static void main(String[] args) {
String s = "532148769";
BinarySearchTree tree = new BinarySearchTree();
for (int i = 0; i < s.length(); i++) {
tree.insert(s.charAt(i));
}
Handler h = new Handler();
tree.inOrderTraverse(h);
tree.levelTraverse(h); // 538247916
// tree.preOrderTraverse(h);
// tree.posOrderTraverse(h);
}
}
?
PHP版本代码
====== 下面是环境配置 ======
配置环境:
E:\Java\jdk1.8.0_171\bin\java.exe "-javaagent:E:\Program Files\JetBrains\IntelliJ IDEA 2020.2.1\lib\idea_rt.jar=58732:E:\Program Files\JetBrains\IntelliJ IDEA 2020.2.1\bin" -Dfile.encoding=UTF-8 -classpath E:\Java\jdk1.8.0_171\jre\lib\charsets.jar;E:\Java\jdk1.8.0_171\jre\lib\deploy.jar;E:\Java\jdk1.8.0_171\jre\lib\ext\access-bridge-64.jar;E:\Java\jdk1.8.0_171\jre\lib\ext\cldrdata.jar;E:\Java\jdk1.8.0_171\jre\lib\ext\dnsns.jar;E:\Java\jdk1.8.0_171\jre\lib\ext\jaccess.jar;E:\Java\jdk1.8.0_171\jre\lib\ext\jfxrt.jar;E:\Java\jdk1.8.0_171\jre\lib\ext\localedata.jar;E:\Java\jdk1.8.0_171\jre\lib\ext\nashorn.jar;E:\Java\jdk1.8.0_171\jre\lib\ext\sunec.jar;E:\Java\jdk1.8.0_171\jre\lib\ext\sunjce_provider.jar;E:\Java\jdk1.8.0_171\jre\lib\ext\sunmscapi.jar;E:\Java\jdk1.8.0_171\jre\lib\ext\sunpkcs11.jar;E:\Java\jdk1.8.0_171\jre\lib\ext\zipfs.jar;E:\Java\jdk1.8.0_171\jre\lib\javaws.jar;E:\Java\jdk1.8.0_171\jre\lib\jce.jar;E:\Java\jdk1.8.0_171\jre\lib\jfr.jar;E:\Java\jdk1.8.0_171\jre\lib\jfxswt.jar;E:\Java\jdk1.8.0_171\jre\lib\jsse.jar;E:\Java\jdk1.8.0_171\jre\lib\management-agent.jar;E:\Java\jdk1.8.0_171\jre\lib\plugin.jar;E:\Java\jdk1.8.0_171\jre\lib\resources.jar;E:\Java\jdk1.8.0_171\jre\lib\rt.jar;D:\code\IdeaProjects\untitled\out\production\simple;C:\Users\mzh\.m2\repository\org\jetbrains\annotations\19.0.0\annotations-19.0.0.jar HelloWorld
Hello world
1 2 3 4 5 6 7 8 9?
Process finished with exit code 0
如果Intellij Idea打不开
关注微信公众号 “PHP大神”
回复“激活码”
https://115.com/s/sw31f8o3hgz?password=df31
jetbrains-agent-202002.zip
访问码:df31
最新更新于:2021-05-03
下载地址:https://pan.baidu.com/s/1ux6PPxZOY37vLKvxAW7zyQ
提取码:jpwl