面试的时候可能会问到二叉树的非递归遍历。
下面是自己写一些二叉树遍历的非递归的代码,仅供参考:
二叉树节点:
class TreeNode { //二叉树节点
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
二叉树前序遍历非递归
代码:
public void preorder(TreeNode root){
if(root==null)
return ;
TreeNode p = root;
Stack<TreeNode> stack = new Stack<TreeNode>();
while(p!=null || !stack.empty()){
while(p!=null){
System.out.println(p.val);
stack.push(p);
p=p.left;
}
while(p==null && !stack.empty()){
p=stack.pop();
p=p.right;
}
}
}
代码:
public void Midd(TreeNode root){ //实现二叉树中序遍历非递归
if(root==null)
return ;
TreeNode p=root;
Stack<TreeNode> stack =new Stack<TreeNode>();
while(p!=null || !stack.empty()){
while(p!=null){
stack.push(p);
p=p.left;
}
if(p==null && !stack.empty()){
p=stack.pop();
System.out.println(p.val);
p=p.right;
}
}
}
后序遍历应该是比较难写的一个,思路是拿到根节点,先将根节点的左子树全部压栈,当遇到左子树为空,则从栈中弹出(用peek,得到节点,但不从栈中删除)一个节点(注意栈中的节点的左子树都是处理过得,所以弹出来的节点不用考虑左子树),判断右子树是否为空,如果右子树为空,则将该节点的值输出,然后把该节点弹出(用pop()弹出节点,这个节点就处理完了),循环处理,直到某个节点的右子树不为空, 如果右子树不为空,则转向处理右子树,但这时要对栈顶节点进行处理,将右指针设为null(可以理解为右子树已经处理),处理右子树。
代码:
public static void postorder(TreeNode root){
if(root==null)
return ;
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode p = root;
TreeNode temp;
while(p!=null || !stack.empty()){
while(p!=null){
stack.push(p);
p=p.left;
}
if(p==null && !stack.empty()){
p=stack.peek();
while(p.right==null){ //如果右指针为空,则左右都处理完了,需要处理本节点
p=stack.pop();
System.out.println(p.val);
if(!stack.empty())
p=stack.peek();
else
return ;
}
if(p.right!=null){
temp=p.right; //如果栈里弹出来的TreeNode右指针不为null,则处理右指针
p.right=null;
p=temp;
}
}
}
}