Java 手撕二叉树

先定义一个结点类

/**
 * 二叉树的结点
 * 
 * @author Administrator
 *
 */
public class Node {

	Object value;
	Node leftChild;
	Node rightChild;

	public Node(Object value) {
		this.value = value;
	}

	public Node(Object value, Node leftChild, Node rightChild) {
		this.value = value;
		this.leftChild = leftChild;
		this.rightChild = rightChild;
	}

	@Override
	public String toString() {
		return "Node [value=" + value + ", leftChild=" + leftChild + ", rightChild=" + rightChild + "]";
	}
	 
}

 

定义一个二叉树接口

public interface BinaryTree {
	
	// 是否空树  
	public boolean isEmpty();
	
	// 树结点数量
	public int size();
	
	// 获取二叉树的高度
	public int getHeight();
	
	// 查询指定值的结点
	public Node findKey(Object value);
	
	// 前序递归遍历  根结点  左结点  右结点
	public void preOrderTraverse();
	
	// 中序递归遍历   左结点  根结点  右结点
	public void inOrderTraverse();
	
	// 后序递归遍历   左结点  右结点  根结点  
	public void postOrderTraverse();
	
	// 后序递归遍历   左结点  右结点  根结点  
	public void postOrderTraverse(Node node);
	
	// 前序遍历非递归操作
	public void preOrderByStack();
	
	// 中序遍历非递归操作
	public void inOrderByStack();
	
	// 后序遍历非递归操作
	public void postOrderByStack();
	
	// 按照层次遍历二叉树
	public void levelOrderByStack();
}

 

实现二叉树的实现类

package com.java.datastructure.tree;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;

/**
 * 二叉树的实现
 * 
 * @author Administrator
 *
 */
public class LinkedBinaryTree implements BinaryTree {

	private Node root; // 代表根结点

	public LinkedBinaryTree() {
	}

	public LinkedBinaryTree(Node root) {
		this.root = root;
	}

	@Override
	public boolean isEmpty() {
		return root == null;
	}

	// 树结点数量
	@Override
	public int size() {
		System.out.print("二叉树的结点个数是:");
		return this.size(root);
	}

	private int size(Node root) {
		if (root == null) {
			return 0;
		} else {
			// 获取左子树的size
			int nl = this.size(root.leftChild);
			// 获取右子树的size
			int nr = this.size(root.rightChild);
			// 取较大值加1即可
			return nl + nr + 1;
		}
	}

	// 获取二叉树的高度
	@Override
	public int getHeight() {
		System.out.print("二叉树的高度是:");
		return getHeight(root);
	}

	private int getHeight(Node root) {
		if (root == null) {
			return 0;
		} else {
			// 获取左子树的高度
			int nl = this.getHeight(root.leftChild);
			// 获取右子树的高度
			int nr = this.getHeight(root.rightChild);
			// 取较大值加1即可
			return nl > nr ? nl + 1 : nr + 1;
		}
	}

	// 查询指定值的结点
	@Override
	public Node findKey(Object value) {
		System.out.println("查找结点值为" + value + ":");
		return this.findKey(value, root);
	}

	private Node findKey(Object value, Node root) {
		if (root == null) {
			return null;
		} else if (root != null && root.value == value) {
			return root;
		} else {
			Node node1 = this.findKey(value, root.leftChild);
			Node node2 = this.findKey(value, root.rightChild);
			if (node1 != null && node1.value == value) {
				return node1;
			} else if (node2 != null && node2.value == value) {
				return node2;
			} else {
				return null;
			}
		}
	}

	// 前序递归遍历 根结点 左结点 右结点
	@Override
	public void preOrderTraverse() {
		System.out.println("==========递归遍历 前序==========");
		preOrderTraverse(root);
		System.out.println();
	}

	private void preOrderTraverse(Node root) {
		if (root != null) {
			// 输出根结点的值
			System.out.print(root.value + "  ");
			// 对左子树进行前序遍历
			preOrderTraverse(root.leftChild);
			// 对右子树进行前序遍历
			preOrderTraverse(root.rightChild);
		}
	}

	// 中序递归遍历 左结点 根结点 右结点
	@Override
	public void inOrderTraverse() {
		System.out.println("==========递归遍历 中序==========");
		inOrderTraverse(root);
		System.out.println();
	}

	private void inOrderTraverse(Node root) {
		if (root != null) {
			// 遍历左结点
			this.inOrderTraverse(root.leftChild);
			// 输出根的值
			System.out.print(root.value + "  ");
			// 遍历右结点
			this.inOrderTraverse(root.rightChild);
		}
	}

	// 后序递归遍历 左结点 右结点 根结点
	@Override
	public void postOrderTraverse() {
		System.out.println("==========递归遍历 后序==========");
		postOrderTraverse(root);
		System.out.println();
	}

	@Override
	public void postOrderTraverse(Node node) {
		if (node != null) {
			// 遍历左结点
			this.postOrderTraverse(node.leftChild);
			// 遍历右结点
			this.postOrderTraverse(node.rightChild);
			// 输出根的值
			System.out.print(node.value + "  ");
		}
	}

	@Override
	public void preOrderByStack() {
		// TODO Auto-generated method stub

	}

	// 中序遍历非递归操作 左结点 根结点 右结点
	@Override
	public void inOrderByStack() {
		System.out.println("==========中序遍历非递归操作==========");
		// 创建栈
		Deque<Node> stack = new LinkedList<Node>();
		Node current = root;
		while (current != null || !stack.isEmpty()) {
			while (current != null) { // 循环   只要左边有结点,就一直循环
				stack.push(current);
				current = current.leftChild; // 中序遍历先输出左结点
			}
			if (!stack.isEmpty()) { // 判断   左边没了,就判断下右子结点
				current = stack.pop();
				System.out.print(current.value + "  ");
				current = current.rightChild;
			}
		}
		System.out.println();
	}

	@Override
	public void postOrderByStack() {
		// TODO Auto-generated method stub

	}

	// 按照层次遍历二叉树 借助队列
	@Override
	public void levelOrderByStack() {
		System.out.println("==========按照层次遍历二叉树(借助队列)==========");

		if (root == null) {
			return;
		}
		Queue<Node> queue = new LinkedList<Node>(); // 链表
		queue.add(root);
		while (queue.size() != 0) {
			int len = queue.size();
			for (int i = 0; i < len; i++) {
				Node temp = queue.poll();
				System.out.print(temp.value + "  ");
				if (temp.leftChild != null) {
					queue.add(temp.leftChild);
				}
				if (temp.rightChild != null) {
					queue.add(temp.rightChild);
				}
			}
		}
		System.out.println();
	}

}

 

测试类

package com.java.datastructure.tree;

public class TestLinkedBinaryTree {

	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);
		BinaryTree tree = new LinkedBinaryTree(node1);

		// 判断二叉树是否为空
		System.out.println("判断二叉树是否为空:" + tree.isEmpty());

		// 判断二叉树是否为空

		// 递归遍历 先序    1 4 5 2 3 6 7 
		tree.preOrderTraverse();

		// 递归遍历 中序   4 5 1 3 2 6 7 
		tree.inOrderTraverse();

		// 递归遍历 后序  5 4 3 7 6 2 1 
		tree.postOrderTraverse();
		
		// 二叉树的高度
		System.out.println(tree.getHeight());
		
		// 树结点数量
		System.out.println(tree.size());

		// 非递归遍历 先序

		// 非递归遍历 中序   4 5 1 3 2 6 7 
		tree.inOrderByStack();

		// 非递归遍历 后序
		
		// 按照层次遍历  借助队列   1 4 2 5 3 6 7 
		tree.levelOrderByStack();
		
		// 在二叉树中查找某个值
		System.out.println(tree.findKey(4));
	}

}

 

测试结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值