`

java-二叉树的遍历-先序、中序、后序(递归和非递归)、层次遍历

 
阅读更多
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;


public class BinTreeTraverse {
	//private int[] array={ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	private int[] array={ 10,6,14,4,8,12,16};//BinarySearchTree
	private static List<Node> nodeList=null;


	public static void main(String[] args) {
		BinTreeTraverse tree=new BinTreeTraverse();
		tree.createBinTree();
		
		preOrder(nodeList.get(0));
		System.out.println();
		preOrderStack(nodeList.get(0));
		System.out.println();
		
		inOrder(nodeList.get(0));
		System.out.println();
		inOrderStack(nodeList.get(0));
		System.out.println();
		
		postOrder(nodeList.get(0));
		System.out.println();
		postOrderStack(nodeList.get(0));
		System.out.println();
		
		levelOrderStack(nodeList.get(0));
	}
	
	
	public static void visit(Node node){
		System.out.print(node.getData()+" ");
	}
	
	//create binary tree from array.the data stored in level-order
	public void createBinTree(){
		
		nodeList=new LinkedList<Node>();
		for(int i=0,len=array.length;i<len;i++){
			nodeList.add(new Node(array[i]));
		}
		
		int len=array.length;
		int lastRootIndex=(len>>1)-1;
		for(int i=lastRootIndex;i>=0;i--){
			Node root=nodeList.get(i);
			int leftIndex=i*2+1;
			Node leftNode=nodeList.get(leftIndex);
			//Node leftNode=new Node(array[leftIndex]);//this is wrong
			root.setLeft(leftNode);
			//最后的那个根节点一定是有左孩子的。右孩子则不一定
			int rightIndex=leftIndex+1;
			if(rightIndex<=len-1){
				Node rightNode=nodeList.get(rightIndex);
				root.setRight(rightNode);
			}
			
		}
	}

	//nonRecursion perOrder Traverse
	public static void preOrderStack(Node root){
		
		Stack<Node> stack=new Stack<Node>();
		Node p=root;
		if(p!=null){
			stack.push(p);
			while(!stack.isEmpty()){
				p=stack.pop();
				visit(p);
				if(p.getRight()!=null)stack.push(p.getRight());
				if(p.getLeft()!=null)stack.push(p.getLeft());
			}
		}
	}
	//nonRecursion inOrder Traverse
	public static void inOrderStack(Node p){
		Stack<Node> stack=new Stack<Node>();
		while(p!=null||!stack.isEmpty()){
			//push all LeftChild,when p has no LeftChild,that means it's root,it should be visited
			while(p!=null){
				stack.push(p);
				p=p.getLeft();
			}
			if(!stack.isEmpty()){
				p=stack.pop();
				visit(p);
				p=p.getRight();
			}
		}
	}
	
	//nonRecursion postOrder Traverse
	public static void postOrderStack(Node p){
		Stack<Node> stack=new Stack<Node>();
		Node q=p;//q,is the latest Node that has been visited
		while(p!=null){
			while(p.getLeft()!=null){
				stack.push(p);
				p=p.getLeft();
			}
			/*
			 while(p!=null){//wrong.when 'while' ends,p=null
				stack.push(p);
				p=p.getLeft();
			}
			 */
			/*left-right-root
			 *when a node:
			 *1.has no right-child -->p.getRight()==null
			 *2.right-child has been visited -->p.getRight()==q
			 *it's time to visit this node.
			 */
			while(p!=null&&(p.getRight()==null||p.getRight()==q)){
				visit(p);
				q=p;
				if(stack.isEmpty())return;
				p=stack.pop();
			}
			stack.push(p);
			p=p.getRight();
		}
	}
	//level order
	public static void levelOrderStack(Node p){
		if(p==null)return;
		List<Node> queue=new LinkedList<Node>();
		queue.add(p);
		while(!queue.isEmpty()){
			Node temp=queue.remove(0);
			System.out.print(temp.data+" ");
			if(temp.left!=null){
				queue.add(temp.left);
			}
			if(temp.right!=null){
				queue.add(temp.right);
			}
		}
		System.out.println();
	}
	
	public static void preOrder(Node root){
		if(root==null){return;}
		System.out.print(root.getData()+" ");
		preOrder(root.getLeft());
		preOrder(root.getRight());
	}
	public static void inOrder(Node root){
		if(root==null){return;}
		inOrder(root.getLeft());
		System.out.print(root.getData()+" ");
		inOrder(root.getRight());
	}
	public static void postOrder(Node root){
		if(root==null){return;}
		postOrder(root.getLeft());
		postOrder(root.getRight());
		System.out.print(root.getData()+" ");
	}

	private static class Node{
		private Node left;
		private Node right;
		private int data;
		Node(int iData){
			data=iData;
			left=null;
			right=null;
		}
		public void setLeft(Node leftNode){
			this.left=leftNode;
		}
		public void setRight(Node rightNode){
			this.right=rightNode;
		}
		public Node getLeft(){
			return left;
		}
		public Node getRight(){
			return right;
		}
		public int getData(){
			return data;
		}
		
	}
	
}

分享到:
评论
3 楼 neyshule 2012-10-22  
写的不对吧,p是nulll的时候还能get?
public static void inOrderStack(Node p){ 
        Stack<Node> stack=new Stack<Node>(); 
        while(p!=null||!stack.isEmpty()){ 
            //push all LeftChild,when p has no LeftChild,that means it's root,it should be visited 
            while(p!=null){ 
                stack.push(p); 
                p=p.getLeft(); 
            } 
            if(!stack.isEmpty()){ 
                p=stack.pop(); 
                visit(p); 
                p=p.getRight(); 
            } 
        } 
    } 
2 楼 ren2881971 2012-07-18  
哎。。 早点学习到就好了 昨天面试 有问道。
1 楼 neyshule 2012-06-13  

相关推荐

    建立二叉树,并输出二叉树的先序,中序和后序遍历序列,以及二叉树的叶子数

    [问题描述] 建立二叉树,并输出二叉树的先序,中序和后序遍历序列,以及二叉树的叶子数。 [基本要求] 要求根据读取的元素建立二叉树,能输出各种遍历。 [实现提示] 可通过输入带空格的前序序列建立二叉链表。

    Java实现二叉树的先序、中序、后续、层次遍历

    其次,遍历二叉树是访问二叉树中所有节点的过程,有四种常用的遍历方法,分别是先序遍历、中序遍历、后序遍历和层次遍历。 先序遍历(Pre-order Traversal)的顺序是根节点 -&gt; 左子树 -&gt; 右子树。在Java中,可以...

    二叉树遍历算法 (递归的、非递归的中序、前序、后序遍历 和 层次遍历 以及 求二叉树的宽度和深度)

    根据访问节点的顺序不同,常见的遍历方法包括前序遍历、中序遍历、后序遍历和层次遍历。此外,我们还需要了解如何计算二叉树的宽度和深度。 #### 三、递归遍历 递归遍历是最直观的方法,它利用了递归的思想,将大的...

    java 二叉树遍历

    Java 二叉树遍历 二叉树是一种重要的数据结构,在计算机科学中有广泛的应用。在 Java 语言中,二叉树的遍历是指从根... Java 中有多种遍历方式,包括先序遍历、中序遍历和后序遍历,每种方式都有其特点和应用场景。

    TwoTree.rar

    在"TwoTree.rar"这个压缩包中,可能包含的是关于二叉树遍历的具体实现代码或者相关问题的示例,可能涉及到不同的编程语言,如C++、Java或Python等。通过学习这些代码,你可以更好地理解如何在实际项目中应用这些遍历...

    二叉树的非递归遍历运算

    二叉树的非递归遍历运算 建立二叉树的三叉链式存储结构,在此基础上完成...4) 非递归的先序遍历、中序遍历、后序遍历算法 5)查找指定结点的双亲。 6)查找指定结点x,若存在返回true,否则返回false 7)求各结点的度。

    complete-binary-tree--traversal.zip_最小完全树

    在“完全二叉树先序、中序、后序、层次遍历.docx”文档中,应该详细列举了每种遍历方法的Java代码实现,以及可能的示例和解析,帮助读者理解如何在实际编程中运用这些概念。通过理解和掌握这些方法,不仅可以解决...

    第05章 数据结构树.zip

    - 在Java中,可以通过类和对象来表示树结构,利用递归或栈、队列等数据结构实现各种遍历算法。节点类通常包含数据、指向子节点的引用以及可能的其他属性。 通过以上知识点的学习,开发者能够理解和实现树的各种...

    二叉树的建立和遍历的演示

    其中,遍历方式包括先序遍历、中序遍历和后序遍历三种,这三种遍历方式分别按照不同的顺序访问树中的各个节点,可以用于不同场景下的问题解决。 #### 三、数据结构设计 为了实现二叉树的操作,首先需要定义二叉树...

    二叉树子程序功能实现

    本话题将详细讲解如何实现二叉树的各种子程序功能,包括创建、计算节点数目、计算叶子数目以及进行先序、中序、后序遍历。 1. **创建二叉树**: 创建二叉树通常涉及定义二叉树节点的数据结构,包括两个指向子节点的...

    java8源码-interview:面试

    非递归的先序、中序、后序(复杂)o(n) 层次遍历 o(n) 常见题: 检查是否为平衡二叉树(高度差不超过1),o(n) 给定有序数组创建二叉查找树 o(log(n)) 计算数每层的节点 o(n) 判断某树是二叉查找树 最小最大法 求树...

    作业3 树形结构及其应用1

    在完成以上任务时,你需要编写相应的C、C++或Java等语言的程序,实现上述算法,并以适当的形式(如文本输出)显示和保存二叉树及其遍历序列。测试数据应覆盖各种可能的情况,确保算法的正确性。注意在提交作业时,...

    数据结构java版

    - 包括层次遍历、先序遍历等。 - **由遍历序列还原树结构** - 根据遍历结果重构原始树的结构。 ##### 6.5 Huffman树 - **二叉编码树** - Huffman树是一种特殊的二叉树,用于构建最优的前缀码。 - **Huffman树及...

    数据结构知识总结

    - **二叉树遍历**:包括先序遍历、中序遍历、后序遍历和层次遍历。 ##### 1. 先序遍历非递归算法 - **原理**:使用栈辅助完成非递归遍历。首先将根节点入栈,然后重复以下步骤直到栈为空:弹出栈顶节点并访问它,...

    计算机二级公共基础知识重点

    - 给定后序遍历序列`dabec`和中序遍历序列`debac`,可以通过递归方式确定前序遍历序列为`cedba`。 3. **排序算法内存需求**: - 归并排序需要额外的辅助空间,因此其内存量需求最大。 4. **数据结构类型**: - ...

    数据结构与算法(Java版)

    - **树与森林的遍历:** 包括先序遍历、中序遍历、后序遍历等。 - **由遍历序列还原树结构:** 根据给定的遍历序列重建原来的树结构。 5. **Huffman树:** - **二叉编码树:** 一种特殊的二叉树,用于编码。 - ...

Global site tag (gtag.js) - Google Analytics