简介
- 三种递归遍历方法,三种递归查找方法,三种迭代遍历方法,一种删除节点方法,一种层次遍历方法。
- 顺序存储二叉树
代码
- 代码1
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
import java.util.Queue;
public class BinaryTreeDemo {
public static void main(String[] args) {
BinaryTree br = new BinaryTree();
Node n1 = new Node(1, 100);
Node n2 = new Node(2, 200);
Node n3 = new Node(3, 300);
Node n4 = new Node(4, 400);
Node n5 = new Node(5, 500);
n1.setLeft(n2);
n1.setRight(n3);
n3.setLeft(n4);
n3.setRight(n5);
br.setRoot(n1);
System.out.println("前序遍历");
br.preOrder();
System.out.println();
System.out.println("中序遍历");
br.infixOrder();
System.out.println();
System.out.println("后序遍历");
br.postOrder();
Node resNode = null;
System.out.println("前序遍历查找:");
resNode = br.preOrderSearch(500);
System.out.println(resNode);
System.out.println("中序遍历查找:");
resNode = br.infixOrderSearch(300);
System.out.println(resNode);
System.out.println("后序遍历查找:");
resNode = br.postOrderSearch(1000);
System.out.println(resNode);
System.out.println("删除4号节点:");
br.deleteNode(4);
br.preOrder();
System.out.println("迭代前序遍历:");
br.preIteration();
System.out.println();
System.out.println("迭代中序遍历:");
br.infixIteration();
System.out.println();
System.out.println("迭代后续遍历:");
br.postIteration();
System.out.println();
System.out.println("层次遍历哦...");
br.levelOrder();
}
}
class BinaryTree{
private Node root;
public void setRoot(Node root) {
this.root = root;
}
public void preOrder() {
if(this.root != null) {
this.root.preOrder();
}else {
System.out.println("二叉树当前为空。。。");
}
}
public void infixOrder() {
if(this.root != null) {
this.root.infixOrder();
}else {
System.out.println("二叉树当前为空。。。");
}
}
public void postOrder() {
if(this.root != null) {
this.root.postOrder();
}else {
System.out.println("二叉树当前为空。。。");
}
}
public Node preOrderSearch(int value) {
if(this.root != null) {
return this.root.preOrderSearch(value);
}else {
return null;
}
}
public Node infixOrderSearch(int value) {
if(this.root != null) {
return this.root.infixOrderSearch(value);
}else {
return null;
}
}
public Node postOrderSearch(int value) {
if(this.root != null) {
return this.root.postOrderSearch(value);
}else {
return null;
}
}
public void deleteNode(int key) {
if(root != null) {
if(root.getKey() == key) {
root = null;
}else {
root.deleteNode(key);
}
}else {
System.out.println("二叉树为空,删除失败");
}
}
public void preIteration() {
if(this.root == null) {
System.out.println("二叉树为空。。。");
return;
}
List<Integer> list = new ArrayList<Integer>();
Deque<Node> stack = new ArrayDeque<Node>();
Node node = this.root;
while(!stack.isEmpty() || node != null) {
while(node != null) {
list.add(node.getKey());
stack.push(node);
node = node.getLeft();
}
node = stack.pop();
node = node.getRight();
}
System.out.println(list.toString());
}
public void infixIteration() {
if(this.root == null) {
System.out.println("二叉树为空。。。");
return;
}
List<Integer> list = new ArrayList<Integer>();
Deque<Node> stack = new ArrayDeque<Node>();
Node node = root;
while(!stack.isEmpty() || node != null) {
while(node != null) {
stack.push(node);
node = node.getLeft();
}
node = stack.pop();
list.add(node.getKey());
node = node.getRight();
}
System.out.println(list.toString());
}
public void postIteration() {
if(root == null) {
System.out.println("二叉树为空...");
return;
}
List<Integer> list = new ArrayList<Integer>();
Deque<Node> stack = new ArrayDeque<Node>();
Node node = root;
Node prev = null;
while(!stack.isEmpty() || node != null) {
while(node != null) {
stack.push(node);
node = node.getLeft();
}
node = stack.pop();
if(node.getRight() == null || node.getRight() == prev) {
list.add(node.getKey());
prev = node;
node = null;
}else {
stack.push(node);
node = node.getRight();
}
}
System.out.println(list.toString());
}
public void levelOrder() {
if(root == null) {
System.out.println("二叉树为空...");
return;
}
List<Integer> list = new ArrayList<Integer>();
Queue<Node> q = new ArrayDeque<Node>();
Node node = root;
q.add(root);
while(!q.isEmpty()) {
node = q.remove();
list.add(node.getKey());
if(node.getLeft() != null) {
q.add(node.getLeft());
}
if(node.getRight() != null) {
q.add(node.getRight());
}
}
System.out.println(list.toString());
}
}
class Node{
private int key;
private int value;
private Node left;
private Node right;
public Node() {}
public Node(int key, int value) {
this.key = key;
this.value = value;
}
public int getKey() {
return this.key;
}
public void setKey(int key) {
this.key = key;
}
public int getValue() {
return this.value;
}
public void setValue(int value) {
this.value = value;
}
public Node getLeft() {
return this.left;
}
public void setLeft(Node left) {
this.left = left;
}
public Node getRight() {
return this.right;
}
public void setRight(Node right) {
this.right = right;
}
public String toString() {
return "Node [key=" + this.key +", value=" + this.value +"]";
}
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);
}
public Node preOrderSearch(int value) {
if(this.value == value) {
return this;
}
Node resNode = null;
if(this.left != null) {
resNode = this.left.preOrderSearch(value);
}
if(resNode != null) {
return resNode;
}
if(this.right != null) {
resNode = this.right.preOrderSearch(value);
}
return resNode;
}
public Node infixOrderSearch(int value) {
Node resNode = null;
if(this.left != null) {
resNode = this.left.infixOrderSearch(value);
}
if(resNode != null) {
return resNode;
}
if(this.value == value) {
return this;
}
if(this.right != null) {
resNode = this.right.infixOrderSearch(value);
}
return resNode;
}
public Node postOrderSearch(int value) {
Node resNode = null;
if(this.left != null) {
resNode = this.left.postOrderSearch(value);
}
if(resNode != null) {
return resNode;
}
if(this.right != null) {
resNode = this.right.postOrderSearch(value);
}
if(resNode != null) {
return resNode;
}
if(this.value == value) {
return this;
}
return null;
}
public void deleteNode(int key) {
if(this.left != null && this.left.key == key) {
this.left = null;
return;
}
if(this.right != null && this.right.key == key) {
this.right = null;
return;
}
if(this.left != null) {
this.left.deleteNode(key);
}
if(this.right != null) {
this.right.deleteNode(key);
}
}
}
- 代码2
public class ArrBinaryTreeDemo {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7};
ArrBinaryTree abt = new ArrBinaryTree(arr);
abt.postOrder();
}
}
class ArrBinaryTree{
int[] arr;
public ArrBinaryTree(int[] arr) {
this.arr = arr;
}
public void preOrder() {
this.preOrder(0);
}
public void infixOrder() {
this.infixOrder(0);
}
public void postOrder() {
this.postOrder(0);
}
public void preOrder(int index) {
if(arr == null || arr.length == 0) {
System.out.println("二叉树为空。。。");
return;
}
System.out.println(arr[index]);
if((2 * index + 1) < arr.length) {
preOrder(2*index+1);
}
if((2 * index + 2) < arr.length) {
preOrder(2*index+2);
}
}
public void infixOrder(int index) {
if(arr == null || arr.length == 0) {
System.out.println("二叉树为空。。。");
return;
}
if((2 * index + 1) < arr.length) {
infixOrder(2*index+1);
}
System.out.println(arr[index]);
if((2 * index + 2) < arr.length) {
infixOrder(2*index+2);
}
}
public void postOrder(int index) {
if(arr == null || arr.length == 0) {
System.out.println("二叉树为空。。。");
return;
}
if((2 * index + 1) < arr.length) {
postOrder(2*index+1);
}
if((2 * index + 2) < arr.length) {
postOrder(2*index+2);
}
System.out.println(arr[index]);
}
}