二叉树的遍历(java版)

节点的定义:

Class BinaryTreeNode{ 
    BinaryTreeNode leftchild; 
    BinaryTreeNode rightchild; 
    int val; 
    BinaryTreeNode(int newval){ 
		leftchild=null; 
		rightchild=null; 
		val=newval; 
}

##层次遍历
按层对树进行遍历

public void BinaryTreeLevelOrder(BinaryTreeNode node){
		if(node==null){
			return;
		}
		LinkedList<BinaryTreeNode> queue=new LinkedList<BinaryTreeNode>();
		queue.add(node);
		while(!queue.isEmpty()){
			node = queue.poll();
			System.out.println(node.val);
			if(node.leftChild!=null){
				queue.add(node.leftChild);
			}
			if(node.rightChild!=null){
				queue.add(node.rightChild);
			}
		}
		 
	}

##先序遍历
首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,
仍然先访问根结点,然后遍历左子树,最后遍历右子树,如果二叉树为空则返回。

  1. 递归
public void BinaryTreePreOrder(BinaryTreeNode node){
    	if(node==null){
			return;
		}
		System.out.println(node.val);
		BinaryTreePreOrder(node.leftChild);
		BinaryTreePreOrder(node.rightChild);
	}
  1. 非递归
	public void BinaryTreeNonCyclePreOrder(BinaryTreeNode node){
		Stack<BinaryTreeNode> stack = new Stack<BinaryTreeNode>();
		while(node!=null||!stack.empty()){
			while(node!=null){
				System.out.println(node.val);
				stack.push(node);
				node = node.leftChild;
			}
			if(!stack.empty()){
				node = stack.pop();
				node = node.rightChild;
			}
		}
	}

##中序遍历
首先遍历左子树,然后访问根结点,最后遍历右子树。如果二叉树为空则返回。

  1. 递归
public void BinaryTreeInOrder(BinaryTreeNode node){
    	if(node==null){
			return;
		}		
		BinaryTreePreOrder(node.leftChild);
		System.out.println(node.val);
		BinaryTreePreOrder(node.rightChild);
	}
  1. 非递归
public void BinaryTreeNonCycleInOrder(BinaryTreeNode node){
		Stack<BinaryTreeNode> stack = new Stack<BinaryTreeNode>();
		while(node!=null || !stack.empty()){
			while(node!=null){
				stack.push(node);
				node = node.leftChild;
			}
			if(!stack.empty()){
				node = stack.pop();
				System.out.println(node.val);
				node = node.rightChild;
			}
		}
	}

##后序遍历
首先遍历左子树,然后遍历右子,最后树访问根结点。如果二叉树为空则返回。

  1. 递归
public void BinaryTreePostOrder(BinaryTreeNode node){
    	if(node==null){
			return;
		}		
		BinaryTreePreOrder(node.leftChild);		
		BinaryTreePreOrder(node.rightChild);
		System.out.println(node.val);
	}
  1. 非递归
	public void BinaryTreeNonCyclePostOrder(BinaryTreeNode node){
		Stack<BinaryTreeNode> stack = new Stack<BinaryTreeNode>(); 
        TreeNode newNode =node;  
        while(node!=null){              
            while(node.leftChild!=null){  
                stack.push(node);  
            }              
            while(node!=null&&(node.rightChild==null||node.rightChild==newNode)){  
                System.out.println(node.val);                  
                newNode =node;  
                if(stack.empty())  
                    return;  
                node=stack.pop();  
            }             
            stack.push(node);  
            node=node.rightChild;  
        }  
	}
点赞