二叉树的非递归遍历
最近在复习算法,所以写了这篇二叉树的遍历算法。
- 二叉树的先序遍历(java实现)
首先利用栈的思想来进行二叉树的先序遍历,因为栈是先进后出的,所以要先存右节点再存左节点,根节点先出栈,然后左右节点存入,然后左节点出栈,它的左右节点进栈,利用循环就实现了对二叉树的先序遍历。
//先序遍历
public static void xfs(TreeNode treeNode)
{
Stack<TreeNode> stack=new Stack();
stack.add(treeNode);
while(!stack.empty())
{
TreeNode ko=stack.pop();
System.out.print(ko.val);
if(ko.right!=null)
stack.push(ko.right);
if(ko.left!=null)
stack.push(ko.left);
}
System.out.println();
}
- 二叉树的中序遍历
中序运用的也是栈的思想,首先从根节点一直往左找,然后将经过的节点存入栈中,如果此节点遍历为null,让栈尾输出,同时节点变为栈尾,然后再指向自己的右节点,循环实现,这样就不会出现重复遍历的问题。
//中序遍历
public static void zfs(TreeNode treeNode)
{
Stack<TreeNode> stack=new Stack();
while (!stack.empty()||treeNode!=null)
{
if(treeNode!=null)
{
stack.push(treeNode);
treeNode=treeNode.left;
}
else
{
treeNode=stack.pop();
System.out.print(treeNode.val+" ");
treeNode=treeNode.right;
}
}
}
- 二叉树的后序遍历
先将根节点加入栈中,如果节点的左右节点都为空,或者左节点遍历过,或右节点遍历过,则将此节点输出,否则判断此节点是否有左右节点,如果有的话就加入到栈中。
//后续遍历
public static void hfs(TreeNode treeNode)
{
Stack <TreeNode> stack=new Stack<>();
TreeNode tr=treeNode;
TreeNode no=null;
stack.add(tr);
System.out.print("后序遍历");
while (!stack.empty())
{
tr=stack.peek();
if((tr.left==null&&tr.right==null)||(no!=null&&no==tr.left||no==tr.right))
{
stack.pop();
System.out.print(tr.val);
no=tr;
}
else{
if(tr.right!=null)
stack.add(tr.right);
if(tr.left!=null)
stack.add(tr.left);
}
}
System.out.println();
}