基础算法001---二叉树遍历 Java
来源:互联网 发布:全国多少个省市 知乎 编辑:程序博客网 时间:2024/05/16 12:23
源代码:
https://github.com/SunnyLoveMaggie/Algorithm/tree/master/src/Algorithm/Basic/BTree
Node:
public class Node<T extends Comparable<T>> {private T data;private Node<T> lNode;private Node<T> rNode;Node(T data){this.data = data;this.lNode = null;this.rNode = null;}/** * @return the data */public T getData() {return data;}/** * @param data the data to set */public void setData(T data) {this.data = data;}/** * @return the lNode */public Node<T> getlNode() {return lNode;}/** * @param lNode the lNode to set */public void setlNode(Node<T> lNode) {this.lNode = lNode;}/** * @return the rNode */public Node<T> getrNode() {return rNode;}/** * @param rNode the rNode to set */public void setrNode(Node<T> rNode) {this.rNode = rNode;}}
Tree:
public class BTree<T extends Comparable<T>> {private Node<T> root;private BTreeTravelable<T> travelMethod;public void insert(T data){Node<T> node = new Node<T>(data);if(root == null){root = node;return;}Node<T> cur = root;Node<T> preNode = null;while(cur!=null){if(cur.getData().compareTo(node.getData()) < 0){preNode = cur;cur = cur.getrNode();} else if(cur.getData().compareTo(node.getData()) > 0){preNode = cur;cur = cur.getlNode();} else {return; // Have already include the data, no need to insert}}if(preNode.getData().compareTo(node.getData()) < 0){preNode.setrNode(node);} else{preNode.setlNode(node);}}public void travelTree(){travelMethod.travel(root);}public void setTravelMethod(BTreeTravelable<T> method){travelMethod = method;}}
遍历接口:
public interface BTreeTravelable<T extends Comparable<T>> {public void travel(Node<T> root);}
前序遍历(非递归):
public class PreOrder <T extends Comparable<T>> implements BTreeTravelable<T>{/* (non-Javadoc) * <p>Title: travel</p> * <p>Description: </p> * @param root * @see Algorithm.BTree.BTreeTravelable#travel(Algorithm.BTree.Node) */@Overridepublic void travel(Node<T> root) {LinkedList<Node <T>> stack = new LinkedList<Node <T>>();stack.push(root);while(!stack.isEmpty()){Node<T> node = stack.poll();if(node != null) {System.out.print(node.getData() + "\t");stack.push(node.getrNode());stack.push(node.getlNode());}}}}
前序遍历(递归):
public class PreOrderRec <T extends Comparable<T>> implements BTreeTravelable<T>{/* (non-Javadoc) * <p>Title: travel</p> * <p>Description: </p> * @param root * @see Algorithm.BTree.BTreeTravelable#travel(Algorithm.BTree.Node) */@Overridepublic void travel(Node<T> root) {if(root != null){System.out.print(root.getData() + "\t");travel(root.getlNode());travel(root.getrNode());}}}
中序遍历(非递归):
public class InOrder <T extends Comparable<T>> implements BTreeTravelable<T>{/* (non-Javadoc) * <p>Title: travel</p> * <p>Description: </p> * @param root * @see Algorithm.BTree.BTreeTravelable#travel(Algorithm.BTree.Node) */@Overridepublic void travel(Node<T> root) {LinkedList<Node <T>> stack = new LinkedList<Node <T>>();Node<T> node = root;while(!stack.isEmpty() || node !=null){while(node!=null){stack.push(node);node = node.getlNode();}if(!stack.isEmpty()){node = stack.pop();System.out.print(node.getData() + "\t");node = node.getrNode();}}}}
中序遍历(递归):
public class InOrderRec <T extends Comparable<T>> implements BTreeTravelable<T>{/* (non-Javadoc) * <p>Title: travel</p> * <p>Description: </p> * @param root * @see Algorithm.BTree.BTreeTravelable#travel(Algorithm.BTree.Node) */@Overridepublic void travel(Node<T> root) {if(root != null){travel(root.getlNode());System.out.print(root.getData() + "\t");travel(root.getrNode());}}}
后序遍历(非递归):
public class PostOrder <T extends Comparable<T>> implements BTreeTravelable<T>{/* (non-Javadoc) * <p>Title: travel</p> * <p>Description: </p> 当上一个访问的结点是右孩子或者当前结点没有右孩子则访问当前结点 * @param root * @see Algorithm.BTree.BTreeTravelable#travel(Algorithm.BTree.Node) */@Overridepublic void travel(Node<T> root) {LinkedList<Node <T>> stack = new LinkedList<Node <T>>();Node<T> node = root;Node<T> rNode = null; while(!stack.isEmpty() || node !=null){while(node!=null){stack.push(node);node = node.getlNode();}node = stack.pop();while(node != null && (node.getrNode() == null || node.getrNode() == rNode)){System.out.print(node.getData() + "\t");rNode = node;if(stack.isEmpty()){return;}node = stack.pop();}stack.push(node);node = node.getrNode();}}}
后序遍历(递归):
public class PostOrderRec <T extends Comparable<T>> implements BTreeTravelable<T>{/* (non-Javadoc) * <p>Title: travel</p> * <p>Description: </p> * @param root * @see Algorithm.BTree.BTreeTravelable#travel(Algorithm.BTree.Node) */@Overridepublic void travel(Node<T> root) {if(root != null){travel(root.getlNode());travel(root.getrNode());System.out.print(root.getData() + "\t");}}}
测试:
public class Test {public static void main(String args[]){BTree<Integer> tree=new BTree<Integer>();tree.insert(49);tree.insert(25);tree.insert(55);tree.insert(10);tree.insert(51);tree.insert(65);System.out.println("前序遍历(递归):");tree.setTravelMethod(new PreOrderRec<Integer>());tree.travelTree();System.out.println();System.out.println("前序遍历(非<span style="font-family: Arial, Helvetica, sans-serif;">递归</span><span style="font-family: Arial, Helvetica, sans-serif;">):");</span>tree.setTravelMethod(new PreOrder<Integer>());tree.travelTree();System.out.println();System.out.println("中序遍历(递归):");tree.setTravelMethod(new InOrderRec<Integer>());tree.travelTree();System.out.println();System.out.println("中序遍历(非递归):");tree.setTravelMethod(new InOrder<Integer>());tree.travelTree();System.out.println();System.out.println("后序遍历(递归):");tree.setTravelMethod(new PostOrderRec<Integer>());tree.travelTree();System.out.println();System.out.println("后序遍历(非递归):");tree.setTravelMethod(new PostOrder<Integer>());tree.travelTree();}}
0 0
- 基础算法001---二叉树遍历 Java
- Java实现二叉树遍历算法
- java二叉树的遍历算法
- java二叉树的遍历算法
- java二叉树的遍历算法
- java二叉树的遍历算法
- java二叉树的遍历算法
- 二叉树的遍历算法Java实现
- java实现二叉树常见遍历算法
- 二叉树遍历算法
- 二叉树遍历算法
- 二叉树遍历算法
- 二叉树遍历算法
- 二叉树遍历算法
- 二叉树遍历算法
- 二叉树遍历算法
- 二叉树遍历算法
- 二叉树遍历算法
- (母函数变形)hdu 2082 找单词
- Nginx+Tomcat配置多个二级域名
- android-基础篇-常用控件
- Android Lib Project与Android Project中R文件的区别
- nyoj.63 小猴子下落【数据结构】 2015/03/11
- 基础算法001---二叉树遍历 Java
- 漫谈高数 特征向量物理意义
- 当标签内有嵌套的子标签的情况下,如何用jquery检索纯文本内容
- 再提mysql编码问题-避免乱码和修复乱码1
- ubuntu下安装myeclipse2014+破解
- Mysql数据类型的长度的认识
- C++虚函数和纯虚函数的区别
- APNS远程推送证书的申请和制作——详细解析
- DecimalFormat 输出指定格式的数字