总结:树的相关遍历算法,非递归1、层序遍历,使用队列来实现;2、前序和中序遍历,用栈来实现;3、后序遍历思想与2相同,出栈时需要判断是否为上次出栈的左右孩子即可。
/*树的结构体定义
*class treeNode{
* int data;
* treeNode left;
* treeNode right;
* treeNode(int n){this.data = n;}
*
*}
*/
//创建树
treeNode createTree(int n){
int i = 1;
treeNode root = new treeNode(i);
Queue<treeNode> result = new LinkedList<treeNode>();
result.add(root);
while(i < n){
result.peek().left = new treeNode(++i);
result.add(result.peek().left);
if(i == n)
return root;
result.peek().right = new treeNode(++i);
result.add(result.peek().right);
result.remove();
}
return root;
}
//层序遍历
void levelorderTravel(treeNode root){
if(root == null)
return;
Queue<treeNode> res = new LinkedList<treeNode>();
res.add(root);
while(!res.isEmpty()){
if(root.left != null)
res.add(root.left);
if(root.right != null)
res.add(root.right);
root = res.remove();
System.out.println(root.data);
}
}
//前序遍历
void preorderTravel(treeNode root){
if(null == root)
return;
Stack<treeNode> pre = new Stack<treeNode>();
treeNode temp;
while( !pre.isEmpty() || root != null){
while(root != null){
pre.push(root);
System.out.println(root.data);
root = root.left;
}
temp = pre.pop();
root = temp.right;
}
}
//中序遍历
void inorderTravel(treeNode root){
if(null == root)
return;
Stack<treeNode> pre = new Stack<treeNode>();
treeNode temp;
while( !pre.isEmpty() || root != null){
while(root != null){
pre.push(root);
root = root.left;
}
temp = pre.pop();
System.out.println(temp.data);
root = temp.right;
}
}
//后序遍历
void postorderTravel(treeNode root){
if(null == root)
return;
Stack<treeNode> pre = new Stack<treeNode>();
treeNode temp, temp_pre;
temp_pre = null;
while( !pre.isEmpty() || root != null){
while(root != null){
pre.push(root);
root = root.left;
}
temp = pre.peek();
if(temp.right == null || temp_pre == temp.right)
{ temp = pre.pop();
System.out.println(temp.data);
}
if(temp_pre != temp.right)
root = temp.right;
temp_pre = temp;
}
}