java二叉树教学_java二叉树操作

package com.commontest.tree;/**

* @author jiangfuqiang

* @version 2016/7/12.

* @see com.commontest.tree

*/

import java.util.LinkedList;

import java.util.List;

/**

* 二叉树

* @author jiangfuqiang

* @date 2016-07-12

*/

public class TestTree {

private int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

private static List nodeList = null;

public static void main(String[] args) {

String[] datas = {

"7","2","6","5","11","5","9","4"

};

TestTree tt = new TestTree();

tt.createBinTree();

Node rootTemp = nodeList.get(0);

System.out.println(tt.getNodeNum(rootTemp));

System.out.println(tt.getDepth(rootTemp));

tt.preOrderTraverse(rootTemp);

System.out.println();

tt.inOrderTraverse(rootTemp);

System.out.println();

tt.postOrderTraverse(rootTemp);

}

public void createBinTree() {

nodeList = new LinkedList();

// 将一个数组的值依次转换为Node节点

for (int nodeIndex = 0; nodeIndex < array.length; nodeIndex++) {

nodeList.add(new Node(array[nodeIndex]+""));

}

// 对前lastParentIndex-1个父节点按照父节点与孩子节点的数字关系建立二叉树

for (int parentIndex = 0; parentIndex < array.length / 2 - 1; parentIndex++) {

// 左孩子

nodeList.get(parentIndex).setLeftNode(nodeList.get(parentIndex * 2 + 1));

// 右孩子

nodeList.get(parentIndex).setRightNode(nodeList.get(parentIndex * 2 + 2));

}

// 最后一个父节点:因为最后一个父节点可能没有右孩子,所以单独拿出来处理

int lastParentIndex = array.length / 2 - 1;

// 左孩子

nodeList.get(lastParentIndex).setLeftNode(nodeList.get(lastParentIndex * 2 + 1));

// 右孩子,如果数组的长度为奇数才建立右孩子

if (array.length % 2 == 1) {

nodeList.get(lastParentIndex).setRightNode(nodeList.get(lastParentIndex * 2 + 2));

}

}

/**

* 二叉树的节点个数

* @param root

* @return

*/

public int getNodeNum(Node root) {

if (root == null) {

return 0;

}

return getNodeNum(root.getLeftNode()) + getNodeNum(root.getRightNode()) +1;

}

/**

* 二叉树的深度

* @param root

* @return

*/

public int getDepth(Node root) {

if (root == null) {

return 0;

}

int leftDepth = getDepth(root.getLeftNode());

int rightDepth = getDepth(root.getRightNode());

return Math.max(leftDepth+1,rightDepth+1);

}

/**

* 前序遍历递归解法:

(1)如果二叉树为空,空操作

(2)如果二叉树不为空,访问根节点,前序遍历左子树,前序遍历右子树

* @param root

*/

public void preOrderTraverse(Node root) {

if (root == null) {

return;

}

visit(root);

preOrderTraverse(root.getLeftNode());

preOrderTraverse(root.getRightNode());

}

/**

*中序遍历递归解法

(1)如果二叉树为空,空操作。

(2)如果二叉树不为空,中序遍历左子树,访问根节点,中序遍历右子树

* @param root

*/

public void inOrderTraverse(Node root) {

if (root == null) {

return;

}

inOrderTraverse(root.getLeftNode());

visit(root);

inOrderTraverse(root.getRightNode());

}

/**

* 后序遍历递归解法

(1)如果二叉树为空,空操作

(2)如果二叉树不为空,后序遍历左子树,后序遍历右子树,访问根节点

* @param root

*/

public void postOrderTraverse(Node root) {

if (root == null) {

return;

}

postOrderTraverse(root.getLeftNode());

postOrderTraverse(root.getRightNode());

visit(root);

}

private void visit(Node root) {

System.out.print("visit: "+root.getValue()+" ");

}

}

class Node {

private String value;

private Node leftNode;

private Node rightNode;

public Node(String value) {

this.value = value;

}

public String getValue() {

return value;

}

public void setValue(String value) {

this.value = value;

}

public Node getLeftNode() {

return leftNode;

}

public void setLeftNode(Node leftNode) {

this.leftNode = leftNode;

}

public Node getRightNode() {

return rightNode;

}

public void setRightNode(Node rightNode) {

this.rightNode = rightNode;

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值