1.二叉树接口
public interface BinaryTreeInterface<T> {
public T getRootData();
public int getHeight();
public int getNumberOfRoot();
public void clear();
public void setTree(T rootData); // 用rootData设置树
public void setTree(T rootData,BinaryTreeInterface<T> left,BinaryTreeInterface<T> right); //设置树,用左右子节点
}
2.节点类
package com.jimmy.impl; public class BinaryNode<T> { private T data; private BinaryNode<T> left; // 左子节点 private BinaryNode<T> right; // 右子节点 public BinaryNode() { this(null); } public BinaryNode(T data) { this(data, null, null); } public BinaryNode(T data, BinaryNode<T> left, BinaryNode<T> right) { this.data = data; this.left = left; this.right = right; } public T getData() { return data; } public void setData(T data) { this.data = data; } public BinaryNode<T> getLeft() { return left; } public void setLeft(BinaryNode<T> left) { this.left = left; } public BinaryNode<T> getRight() { return right; } public void setRight(BinaryNode<T> right) { this.right = right; } public boolean hasLeft() { return left != null; } public boolean hasRight() { return right != null; } public boolean isLeaf() { return (left == null) && (right == null);
package com.jimmy.impl; import java.util.Stack; import com.jimmy.BinaryTreeInterface; public class Binarytree<T> implements BinaryTreeInterface<T> { private BinaryNode<T> root; // 只要一个数据节点就够了 // 构造空树 public Binarytree() { root = null; } // 用rootData构造树(有个根) public Binarytree(T rootdata) { root = new BinaryNode<T>(rootdata); } // 用其他树构造树 public Binarytree(T rootdata, Binarytree<T> leftTree, Binarytree<T> rightTree) { root = new BinaryNode<T>(rootdata); if (leftTree != null) { root.setLeft(leftTree.root); } if (rightTree != null) { root.setRight(rightTree.root); } } // 用rootData设置树(有个根) @Override public void setTree(T rootData) { root = new BinaryNode<T>(rootData); } // 用其他树设置树 public void setTree(T rootData, BinaryTreeInterface<T> left, BinaryTreeInterface<T> right) { root = new BinaryNode<T>(rootData); Binarytree leftTree = null; Binarytree rightTree = null; if ((leftTree = (Binarytree) left) != null) { root.setLeft(leftTree.root); } if ((rightTree = (Binarytree) right) != null) { root.setRight(rightTree.root); } } @Override public void clear() { root = null; } @Override public int getHeight() { // TODO Auto-generated method stub return root.getHeight(); } @Override public int getNumberOfRoot() { // TODO Auto-generated method stub return 0; } @Override public T getRootData() { if (root != null) return root.getData(); else return null; } public BinaryNode<T> getRoot() { return root; } public void setRoot(BinaryNode<T> root) { this.root = root; } public int getNumOfNodes() { return root.getNumOfNodes(); } public void inOrderTraverse() { inOrderTraverse(root); } // 用栈方法遍历 public void inOrderStackTraverse() { Stack<BinaryNode> stack = new Stack<BinaryNode>(); BinaryNode cur = root; // stack.push(root); while (!stack.isEmpty() || (cur != null)) { while (cur != null) { stack.push(cur); cur = cur.getLeft(); } if (!stack.isEmpty()) { BinaryNode tmp = stack.pop(); if (tmp != null) { System.out.println(tmp.getData()); cur = tmp.getRight(); } } } } // 递归遍历 public void inOrderTraverse(BinaryNode<T> node) { if (node != null) { inOrderTraverse(node.getLeft()); System.out.println(node.getData()); inOrderTraverse(node.getRight()); } } public static void main(String[] args) { Binarytree<String> t = new Binarytree<String>(); Binarytree<String> t8 = new Binarytree<String>("8"); Binarytree<String> t7 = new Binarytree<String>("7"); t.setTree("6", t7, t8); // 用t7,t8设置树t t.inOrderStackTraverse(); System.out.println(t.getHeight()); } }
}public int getHeight() {return getHeight(this);}public int getHeight(BinaryNode<T> node) {int h = 0;if (node != null)h = 1 + Math.max(node.getHeight(node.left), node.getHeight(node.right));return h;}public int getNumOfNodes() {int lnum = 0, rnum = 0;if (left != null)lnum = left.getNumOfNodes();if (right != null)rnum = right.getNumOfNodes();return lnum + rnum + 1;}}
3.二叉树实现