二叉树查找

来源:互联网 发布:java源码阅读工具 编辑:程序博客网 时间:2024/05/17 05:58

/** * 功能:把一个数组的值存入二叉树中,然后进行3种方式的遍历 *  * 参考资料0:数据结构(C语言版)严蔚敏 *  * 参考资料1:http://zhidao.baidu.com/question/81938912.html *  * 参考资料2:http://cslibrary.stanford.edu/110/BinaryTrees.html#java *  * @author ocaicai@yeah.net @date: 2011-5-17 *  */public class BinTreeTraverse2 {private int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11 };private static List<Node> nodeList = null;/** * 内部类:节点 *  * @author ocaicai@yeah.net @date: 2011-5-17 *  */private static class Node {Node leftChild;Node rightChild;int data;Node(int newData) {leftChild = null;rightChild = null;data = newData;}}public void createBinTree() {nodeList = new LinkedList<Node>();// 将一个数组的值依次转换为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).leftChild = nodeList.get(parentIndex * 2 + 1);// 右孩子nodeList.get(parentIndex).rightChild = nodeList.get(parentIndex * 2 + 2);}// 最后一个父节点:因为最后一个父节点可能没有右孩子,所以单独拿出来处理int lastParentIndex = array.length / 2 - 1;// 左孩子nodeList.get(lastParentIndex).leftChild = nodeList.get(lastParentIndex * 2 + 1);// 右孩子,如果数组的长度为奇数才建立右孩子if (array.length % 2 == 1) {nodeList.get(lastParentIndex).rightChild = nodeList.get(lastParentIndex * 2 + 2);}}/** * 先序遍历 *  * 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已 *  * @param node *            遍历的节点 */public static void preOrderTraverse(Node node) {if (node == null)return;System.out.print(node.data + " ");preOrderTraverse(node.leftChild);preOrderTraverse(node.rightChild);}/** * 中序遍历 *  * 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已 *  * @param node *            遍历的节点 */public static void inOrderTraverse(Node node) {if (node == null)return;inOrderTraverse(node.leftChild);System.out.print(node.data + " ");inOrderTraverse(node.rightChild);}/** * 后序遍历 *  * 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已 *  * @param node *            遍历的节点 */public static void postOrderTraverse(Node node) {if (node == null)return;postOrderTraverse(node.leftChild);postOrderTraverse(node.rightChild);System.out.print(node.data + " ");}public static void main(String[] args) {BinTreeTraverse2 binTree = new BinTreeTraverse2();binTree.createBinTree();// nodeList中第0个索引处的值即为根节点Node root = nodeList.get(0);System.out.println("先序遍历:");preOrderTraverse(root);System.out.println();System.out.println("中序遍历:");inOrderTraverse(root);System.out.println();System.out.println("后序遍历:");postOrderTraverse(root);}}

原文: http://blog.csdn.net/wuwenxiang91322/article/details/12231657


package com.cq.test;import java.util.Stack;/** * 二叉树的链式存储 * @author WWX */public class BinaryTree {private TreeNode root=null;public BinaryTree(){root=new TreeNode(1,"rootNode(A)");}/** * 创建一棵二叉树 * <pre> *           A *     B          C *  D     E            F *  </pre> * @param root * @author WWX */public void createBinTree(TreeNode root){TreeNode newNodeB = new TreeNode(2,"B");        TreeNode newNodeC = new TreeNode(3,"C");        TreeNode newNodeD = new TreeNode(4,"D");        TreeNode newNodeE = new TreeNode(5,"E");        TreeNode newNodeF = new TreeNode(6,"F");        root.leftChild=newNodeB;        root.rightChild=newNodeC;        root.leftChild.leftChild=newNodeD;        root.leftChild.rightChild=newNodeE;        root.rightChild.rightChild=newNodeF;}public boolean isEmpty(){return root==null;}//树的高度public int height(){return height(root);}//节点个数public int size(){return size(root);}private int height(TreeNode subTree){if(subTree==null)return 0;//递归结束:空树高度为0else{int i=height(subTree.leftChild);int j=height(subTree.rightChild);return (i<j)?(j+1):(i+1);}}private int size(TreeNode subTree){if(subTree==null){return 0;}else{return 1+size(subTree.leftChild)+size(subTree.rightChild);}}//返回双亲结点public TreeNode parent(TreeNode element){return (root==null|| root==element)?null:parent(root, element);}public TreeNode parent(TreeNode subTree,TreeNode element){if(subTree==null)return null;if(subTree.leftChild==element||subTree.rightChild==element)//返回父结点地址return subTree;TreeNode p;//现在左子树中找,如果左子树中没有找到,才到右子树去找if((p=parent(subTree.leftChild, element))!=null)//递归在左子树中搜索return p;else//递归在右子树中搜索return parent(subTree.rightChild, element);}public TreeNode getLeftChildNode(TreeNode element){return (element!=null)?element.leftChild:null;}public TreeNode getRightChildNode(TreeNode element){return (element!=null)?element.rightChild:null;}public TreeNode getRoot(){return root;}//在释放某个结点时,该结点的左右子树都已经释放,//所以应该采用后续遍历,当访问某个结点时将该结点的存储空间释放public void destroy(TreeNode subTree){//删除根为subTree的子树if(subTree!=null){//删除左子树destroy(subTree.leftChild);//删除右子树destroy(subTree.rightChild);//删除根结点subTree=null;}}public void traverse(TreeNode subTree){System.out.println("key:"+subTree.key+"--name:"+subTree.data);;traverse(subTree.leftChild);traverse(subTree.rightChild);}//前序遍历public void preOrder(TreeNode subTree){if(subTree!=null){visted(subTree);preOrder(subTree.leftChild);preOrder(subTree.rightChild);}}//中序遍历public void inOrder(TreeNode subTree){if(subTree!=null){inOrder(subTree.leftChild);visted(subTree);inOrder(subTree.rightChild);}}//后续遍历public void postOrder(TreeNode subTree) {if (subTree != null) {postOrder(subTree.leftChild);            postOrder(subTree.rightChild);            visted(subTree);        }}//前序遍历的非递归实现public void nonRecPreOrder(TreeNode p){Stack<TreeNode> stack=new Stack<TreeNode>();TreeNode node=p;while(node!=null||stack.size()>0){while(node!=null){visted(node);stack.push(node);node=node.leftChild;}//<span abp="507" style="font-size:14px;">while</span>(stack.size()>0){while(stack.size()>0){node=stack.pop();node=node.rightChild;} }}//中序遍历的非递归实现public void nonRecInOrder(TreeNode p){Stack<TreeNode> stack =new Stack<BinaryTree.TreeNode>();TreeNode node =p;while(node!=null||stack.size()>0){//存在左子树while(node!=null){stack.push(node);node=node.leftChild;}//栈非空if(stack.size()>0){node=stack.pop();visted(node);node=node.rightChild;}}}//后序遍历的非递归实现public void noRecPostOrder(TreeNode p){Stack<TreeNode> stack=new Stack<BinaryTree.TreeNode>();TreeNode node =p;while(p!=null){//左子树入栈for(;p.leftChild!=null;p=p.leftChild){stack.push(p);}//当前结点无右子树或右子树已经输出while(p!=null&&(p.rightChild==null||p.rightChild==node)){visted(p);//纪录上一个已输出结点node =p;if(stack.empty())return;p=stack.pop();}//处理右子树stack.push(p);p=p.rightChild;}}public void visted(TreeNode subTree){subTree.isVisted=true;System.out.println("key:"+subTree.key+"--name:"+subTree.data);;}/** * 二叉树的节点数据结构 * @author WWX */private class  TreeNode{private int key=0;private String data=null;private boolean isVisted=false;private TreeNode leftChild=null;private TreeNode rightChild=null;public TreeNode(){}/** * @param key  层序编码 * @param data 数据域 */public TreeNode(int key,String data){this.key=key;this.data=data;this.leftChild=null;this.rightChild=null;}}//测试public static void main(String[] args) {        BinaryTree bt = new BinaryTree();        bt.createBinTree(bt.root);        System.out.println("the size of the tree is " + bt.size());        System.out.println("the height of the tree is " + bt.height());                System.out.println("*******(前序遍历)[ABDECF]遍历*****************");        bt.preOrder(bt.root);                System.out.println("*******(中序遍历)[DBEACF]遍历*****************");        bt.inOrder(bt.root);               System.out.println("*******(后序遍历)[DEBFCA]遍历*****************");        bt.postOrder(bt.root);                System.out.println("***非递归实现****(前序遍历)[ABDECF]遍历*****************");        bt.nonRecPreOrder(bt.root);                System.out.println("***非递归实现****(中序遍历)[DBEACF]遍历*****************");        bt.nonRecInOrder(bt.root);                System.out.println("***非递归实现****(后序遍历)[DEBFCA]遍历*****************");        bt.noRecPostOrder(bt.root);    }}



0 0
原创粉丝点击