import java.util.Stack;
public class BinaryTree {
TreeNode root = null;
public BinaryTree() {
this.root = new TreeNode("A");
}
/*
* 构建二叉树
* A
* B C
* D E F
*/
public void createTree() {
TreeNode nodeb = new TreeNode("B");
TreeNode nodec = new TreeNode("C");
TreeNode noded = new TreeNode("D");
TreeNode nodee = new TreeNode("E");
TreeNode nodef = new TreeNode("F");
root.leftchild = nodeb;
root.rightchild = nodec;
nodeb.leftchild = noded;
nodeb.rightchild = nodee;
nodec.rightchild = nodef;
}
/*
* 构建另外一个二叉树来测试代码是否正确
* A
* B C
* D E F G
* H I J K
*/
public void createTestTree() {
TreeNode nodeb = new TreeNode("B");
TreeNode nodec = new TreeNode("C");
TreeNode noded = new TreeNode("D");
TreeNode nodee = new TreeNode("E");
TreeNode nodef = new TreeNode("F");
TreeNode nodeg = new TreeNode("G");
TreeNode nodeh = new TreeNode("H");
TreeNode nodei = new TreeNode("I");
TreeNode nodej = new TreeNode("J");
TreeNode nodek = new TreeNode("K");
root.leftchild = nodeb;
root.rightchild = nodec;
nodeb.leftchild = noded;
nodeb.rightchild = nodee;
noded.leftchild = nodeh;
nodee.leftchild = nodei;
nodec.leftchild = nodef;
nodec.rightchild = nodeg;
nodef.rightchild = nodej;
nodeg.leftchild = nodek;
}
/*
* 求二叉树的高度
*/
public int getHeight() {
return getHeight(this.root);
}
private int getHeight(TreeNode r) {
if(r == null) {
return 0;
}
else {
int heightL = getHeight(r.leftchild);
int heightR = getHeight(r.rightchild);
return (heightL > heightR) ? (heightL+1): (heightR+1);
}
}
/*
* 求二叉树节点个数
*/
public int getSize() {
return getSize(this.root);
}
private int getSize(TreeNode r) {
if(r == null) {
return 0;
}
else {
return 1 + getSize(r.leftchild) + getSize(r.rightchild);
}
}
/*
* 前序遍历
*/
public void preOrder(TreeNode node) {
if(node == null) {
return;
}
else {
System.out.print(node.value + " ");
preOrder(node.leftchild);
preOrder(node.rightchild);
}
}
/*
* 中序遍历
*/
public void inOrder(TreeNode node) {
if(node == null) {
return;
}else {
inOrder(node.leftchild);
System.out.print(node.value + " ");
inOrder(node.rightchild);
}
}
/*
* 后序遍历
*/
public void postOrder(TreeNode node) {
if(node == null) {
return;
}else {
postOrder(node.leftchild);
postOrder(node.rightchild);
System.out.print(node.value + " ");
}
}
/*
* 用非迭代方法实现前序遍历,用栈
* tip 判断栈是否为空 不能用 a != null, 应该用 !a.isEmpty()
*/
public void preOrderInStack(TreeNode node) {
Stack> a = new Stack<>();
if(node == null) {
System.out.println("空树");
}else {
a.push(node);
while(!a.isEmpty()) {
TreeNode b = a.pop();
System.out.print(b.value + " ");
if(b.rightchild != null) {
a.push(b.rightchild);
}
if(b.leftchild != null) {
a.push(b.leftchild);
}
}
}
}
/*
* 用非迭代方法实现中序遍历
*/
public void inOrderInStack(TreeNode node) {
Stack> a = new Stack<>();
if(node == null) {
System.out.println("空树");
}else {
a.push(node);
TreeNode b = a.peek();
while(b.leftchild != null) {
a.push(b.leftchild);
b = a.peek();
}
while(!a.isEmpty()) {
TreeNode c = a.peek();
if(c.leftchild == null || c.leftchild.isChecked == true) {
a.pop();
c.isChecked = true;
System.out.print(c.value + " ");
}else {
a.push(c.leftchild);
continue;
}
if(c.rightchild != null) {
a.push(c.rightchild);
}
}
}
}
/*
* 用非迭代方法实现后序遍历
*/
public void postOrderInStack(TreeNode node) {
Stack> a = new Stack<>();
if(node == null) {
System.out.println("空树");
}else {
a.push(node);
TreeNode b = a.peek();
while(b.leftchild != null) {
a.push(b.leftchild);
b = a.peek();
}
while(!a.isEmpty()) {
TreeNode c = a.peek();
if(c.rightchild != null && c.rightchild.isChecked == false) {
a.push(c.rightchild);
}
if(c.leftchild != null && c.leftchild.isChecked == false) {
a.push(c.leftchild);
}
if(c != a.peek()) {
continue;
}else {
a.pop();
c.isChecked = true;
System.out.print(c.value + " ");
}
}
}
}
/*
* 进行非迭代的中序或者后序遍历以后,要从新把元素的isChecked属性设置为false,以避免影响另外一个遍历
*/
public void unchecked(TreeNode node) {
if(node == null) {
return;
}else {
node.isChecked = false;
unchecked(node.leftchild);
unchecked(node.rightchild);
}
}
public class TreeNode{
private E value;
private TreeNode leftchild;
private TreeNode rightchild;
private boolean isChecked;
public TreeNode(E val) {
this.value = val;
this.leftchild = null;
this.rightchild = null;
this.isChecked = false;
}
public E getValue() {
return value;
}
public void setValue(E value) {
this.value = value;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
BinaryTree tree = new BinaryTree();
tree.createTestTree();
TreeNode r = tree.root;
System.out.println(tree.getHeight());
System.out.println(tree.getSize());
tree.preOrder(r);
System.out.print("\n");
tree.inOrder(r);
System.out.print("\n");
tree.postOrder(r);
System.out.print("\n");
tree.preOrderInStack(r);
System.out.print("\n");
tree.inOrderInStack(r);
System.out.print("\n");
tree.unchecked(r);
tree.postOrderInStack(r);
}
}