java数据结构编写二叉树_java 数据结构与算法 BinaryTree二叉树编写

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);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值