LinkedBinaryTree 具体实现代码
package c.cn.com.demo03;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
public class LinkedBinaryTree implements BinaryTree {
private Node root;
public LinkedBinaryTree(){
}
public LinkedBinaryTree(Node root) {
this.root = root;
}
@Override
public boolean isEmpty() {
return null == root;
}
@Override
public int size() {
return this.size(root);
}
private int size(Node node) {
if(node == null){
return 0;
}
int left = this.size(node.left);
int right = this.size(node.right);
return (left + right + 1);
}
@Override
public int getHeight() {
return getHeight(root);
}
private int getHeight(Node node) {
if(null == node){
return 0;
}
int leftHeight = this.getHeight(node.left);
int rightHeight = this.getHeight(node.right);
return (leftHeight > rightHeight ? leftHeight : rightHeight) + 1;
}
@Override
public Node findKey(int value) {
return findKey(value,root);
}
public Node findKey(int value, Node node) {
if(null == node){
return null;
}else if(null != node && value == node.value){
return node;
}else{
Node node1 = this.findKey(value, node.left);
Node node2 = this.findKey(value, node.right);
if(node1 != null && node1.value == value){
return node1;
}else if(node2 != null && node2.value == value){
return node2;
}else{
return null;
}
}
}
@Override
public void preOrderTraverse() {
if(root != null){
System.out.printf(root.value + " ");
LinkedBinaryTree left = new LinkedBinaryTree(root.left);
left.preOrderTraverse();
LinkedBinaryTree right = new LinkedBinaryTree(root.right);
right.preOrderTraverse();
}
}
@Override
public void inOrderTraverse() {
System.out.println("中序遍历(递归): ");
this.inOrderTraverse(root);
System.out.println();
}
private void inOrderTraverse(Node node){
if(node != null){
this.inOrderTraverse(node.left);
System.out.print(node.value + " ");
this.inOrderTraverse(node.right);
}
}
@Override
public void postOrderTraverse() {
System.out.println("后序遍历(递归): ");
postOrderTraverse(root);
System.out.println();
}
@Override
public void postOrderTraverse(Node node) {
if( null != node ){
this.postOrderTraverse(node.left);
this.postOrderTraverse(node.right);
System.out.print(node.value + " ");
}
}
@Override
public void inOrderByStack() {
Deque<Node> stack = new LinkedList<>();
Node current = root;
while(current != null || !stack.isEmpty()){
while(current != null){
stack.push(current);
current = current.left;
}
if(!stack.isEmpty()){
current = stack.poll();
System.out.print(current.value + " ");
current = current.right;
}
}
}
@Override
public void preOrderByStack() {
Deque<Node> stack = new LinkedList<>();
Node current = root;
while(current != null || !stack.isEmpty()){
while(current != null){
stack.push(current);
System.out.print(current.value + " ");
current = current.left;
}
if(!stack.isEmpty()){
current = stack.poll();
current = current.right;
}
}
}
@Override
public void postOrderByStack() {
Deque<Node> stack = new LinkedList<>();
Node current = root;
Node preNode = null;
while(current != null || !stack.isEmpty()){
while(current != null){
stack.push(current);
current = current.left;
}
if(!stack.isEmpty()){
current = stack.peek().right;
if(current == null || current == preNode){
current = stack.poll();
System.out.print(current.value + " ");
preNode = current;
current = null;
}
}
}
}
@Override
public void levelOrderByStack() {
if(root == null){
return;
}
Queue<Node> queue = new LinkedList<>();
queue.offer(root);
while(queue.size() > 0){
int len = queue.size();
for(int i = 0;i < len;i++){
Node node = queue.poll();
System.out.print(node.value + " ");
if(node.left != null){
queue.offer(node.left);
}
if(node.right != null){
queue.offer(node.right);
}
}
}
System.out.println();
}
}
Node节点
package c.cn.com.demo03;
public class Node {
int value;
Node left;
Node right;
@Override
public String toString() {
return "Node{" +
"value=" + value +
", left=" + left +
", right=" + right +
'}';
}
public Node() {
}
public Node(int value, Node left, Node right) {
this.value = value;
this.left = left;
this.right = right;
}
public Node(int value) {
this.value = value;
}
public Object getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public Node getLeft() {
return left;
}
public void setLeft(Node left) {
this.left = left;
}
public Node getRight() {
return right;
}
public void setRight(Node right) {
this.right = right;
}
}
Test测试
package c.cn.com.demo03;
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
Node node5 = new Node(5,null,null);
Node node4 = new Node(4,null,node5);
Node node7 = new Node(7,null,null);
Node node6 = new Node(6, null,node7);
Node node3 = new Node(3,null,null);
Node node2 = new Node(2,node3,node6);
Node node1 = new Node(1,node4,node2);
LinkedBinaryTree tree = new LinkedBinaryTree(node1);
boolean empty = tree.isEmpty();
System.out.println("二叉树是否为空: " + empty);
System.out.println("先序遍历(递归): ");
tree.preOrderTraverse();
System.out.println();
tree.inOrderTraverse();
tree.postOrderTraverse();
System.out.println("树的高度: " + tree.getHeight());
System.out.println("树的节点个数: " + tree.size());
Node node = tree.findKey(1);
System.out.println(node);
System.out.println("树按照层次遍历二叉树: ");
tree.levelOrderByStack();
System.out.println("中序遍历非递归操作: ");
tree.inOrderByStack();
System.out.println();
System.out.println("先序遍历非递归操作: ");
tree.preOrderByStack();
System.out.println();
System.out.println("后序遍历非递归操作: ");
tree.postOrderByStack();
}
}