Java实现二叉树的前序、中序、后序遍(递归+非递归)
假设一个二叉树类为 BinaryNode
BinaryNode node = new BinaryNode();
左子节点:BinaryNode left = node.left;
右子节点:BinaryNode right = node.right;
节点所存值:node.element;
-
递归方式:过于简单。
-
前序
public void preOrder( BinaryNode node ){ if( node != null ){ System.out.println(node.element + ""); preOrder( node.left ); preOrder( node.right ); } }
-
后序
public void posOrder( BinaryNode node ){ if( node != null ){ posOrder( node.left ); posOrder( node.right ); System.out.println(node.element + ""); } }
-
中序
public void midOrder( BinaryNode node ){ if( node != null ){ midOrder( node.left ); System.out.println(node.element + ""); midOrder( node.right ); } }
-
-
非递归方式
-
前序
- 由根节点开始依次读取每一个左子节点,每读取到一个左子节点(包括根节点 )直接输出;利用stack栈记录当前根节点用来遍历右节点。
public void preOrder( BinaryNode node ){ Stack<BinaryNode> stack = new Stack<>(); while( node != null || !stack.empty() ){ whilr( node != null ){ System.out.print(node.element + ""); stack.push( node ); //已经读取的入栈 node = node.left; } while( !stack.empty() ){ node = stack.pop(); node = node.right; } } }
-
后序:后序遍历,由根节点开始到每一个右自己单,依次排序必然为偏序结果的后面;
-
图例:
-
后序遍历结果:D B E F C A;从结果看,A、C、F依次是根节点到每一个右节点,E则为右子树的一个左节;而左子树可以看正新的一个二叉树来看,理解是一样的。
public void posOrder( BinaryNode node ){ Stack<BinaryNode> stack1 = new Stack<>(); //记录节点,用以寻找左子树 Stack<BinaryNode> stack2 = new Stack<>(); //用来存储实际遍历结束后的顺序 while( node != null || !stack1.empty() ){ //右节点,读完。 while( node != null ){ stack1.push( node ); stack2.push( node ); node = node.right; } //找左子树的节点 if( !stack1.empty() ){ node = stack1.pop(); node = node.left; //转向左子树 } //打印结果 while( !stack2.empty() ){ node = stack2.pop(); System.out.println(node.element+""); } } }
-
-
中序
public void posOrder( BinaryNode node ){ Stack<BinaryNode> stack = new Stack<>(); while( node != null || !stack.empty() ){ whilr( node != null ){ stack.push( node ); //已经读取的入栈 node = node.left; } while( !stack.empty() ){ node = stack.pop(); System.out.print(node.element + ""); node = node.right; } } }
-