二叉树前序后序中序遍历
创建二叉树代码
private static class TreeNode {
public final int value;
public TreeNode left;
public TreeNode right;
public TreeNode ( int value) {
this . value = value;
}
}
public static TreeNode createTree ( int [ ] treeArr) {
TreeNode [ ] root = new TreeNode [ treeArr. length] ;
for ( int i = 0 ; i < treeArr. length; i++ ) {
if ( treeArr[ i] == - 1 ) {
root[ i] = null ;
continue ;
}
TreeNode node = new TreeNode ( treeArr[ i] ) ;
root[ i] = node;
if ( i == 0 ) continue ;
if ( i % 2 == 1 ) {
root[ i / 2 ] . left = node;
} else {
root[ ( i - 1 ) / 2 ] . right = node;
}
}
return root[ 0 ] ;
}
前序遍历
public static void treeForeachFirst ( TreeNode root) {
Queue < TreeNode > stack = new LinkedList < > ( ) ;
stack. add ( root) ;
while ( ! stack. isEmpty ( ) ) {
TreeNode pop = stack. poll ( ) ;
System . out. print ( pop. value + " " ) ;
if ( pop. left != null ) stack. add ( pop. left) ;
if ( pop. right != null ) stack. add ( pop. right) ;
}
}
中序遍历和后续遍历要用到一个帮助类
private static class HelpTreeNode {
public final TreeNode realNode;
public boolean isCheckChild = false ;
public HelpTreeNode ( TreeNode realNode) {
this . realNode = realNode;
}
}
中序遍历
public static void treeForeachMid ( TreeNode root) {
Stack < HelpTreeNode > stack = new Stack < > ( ) ;
stack. push ( new HelpTreeNode ( root) ) ;
while ( ! stack. isEmpty ( ) ) {
HelpTreeNode pop = stack. pop ( ) ;
if ( pop. isCheckChild) {
System . out. print ( pop. realNode. value + " " ) ;
} else {
if ( pop. realNode. right != null ) {
stack. push ( new HelpTreeNode ( pop. realNode. right) ) ;
}
stack. push ( pop) ;
pop. isCheckChild = true ;
if ( pop. realNode. left != null ) {
stack. push ( new HelpTreeNode ( pop. realNode. left) ) ;
}
}
}
}
后序遍历
public static void treeForeachLast ( TreeNode root) {
Stack < HelpTreeNode > stack = new Stack < > ( ) ;
stack. push ( new HelpTreeNode ( root) ) ;
while ( ! stack. isEmpty ( ) ) {
HelpTreeNode pop = stack. pop ( ) ;
if ( pop. isCheckChild) {
System . out. print ( pop. realNode. value + " " ) ;
} else {
stack. push ( pop) ;
if ( pop. realNode. right != null ) {
stack. push ( new HelpTreeNode ( pop. realNode. right) ) ;
}
pop. isCheckChild = true ;
if ( pop. realNode. left != null ) {
stack. push ( new HelpTreeNode ( pop. realNode. left) ) ;
}
}
}
}
运行
public static void main ( String [ ] args) {
TreeNode tree = createTree ( new int [ ] { 1 , 2 , 3 , 4 , 5 , 6 , 7 , - 1 , - 1 , - 1 , - 1 , 8 , 9 , - 1 , 10 } ) ;
treeForeachFirst ( tree) ;
System . out. println ( ) ;
treeForeachMid ( tree) ;
System . out. println ( ) ;
treeForeachLast ( tree) ;
}