二叉树的前序、中序、后序以及层次遍历(非递归)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35508033/article/details/89041242

中序遍历非递归

class TreeNode {
     int val;
     TreeNode left;
     TreeNode right;
     TreeNode(int x) { val = x; }
}
//中序遍历非递归(左--根--右)
class Solution {
    public void LDR(TreeNode node) {
        Stack<TreeNode> stack = new Stack<>();
        while(node!=null||!stack.isEmpty()){
            if(node!=null){
                //先将根节点加入到栈中,再依次将左子树的左节点全部加入到栈中
                stack.push(node);
                node=node.left;
            }else{
                node=stack.pop();//先取出左栈中的左节点的值和根节点的值,再放入右节点
                System.out.println(node.val+" ");
                node=node.right;
            }
        }
    }
}

前序遍历非递归

public class TreeNode {//二叉树节点结构
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}
//前序遍历非递归(根--左--右)
public static void DLR(TreeNode node){
    if(node!=null){
        Stack<TreeNode> stack = new Stack<TreeNode>();
        stack.push(node);
        while(!stack.isEmpty()){
            node = stack.pop();
            System.out.print(node.val+" ");
            if(node.right!=null)stack.push(node.right);//左节点放入栈中
            if(node.left!=null)stack.push(node.left);//右节点放入栈中
        }
    }
}

层次遍历非递归

public static void levelOrder(TreeNode node){
    Queue<TreeNode> queue=new LinkedBlockingDeque<TreeNode>();
    queue.offer(node);//根节点入队
    while(!queue.isEmpty()){
        node=queue.poll();
        System.out.print(node.val+" ");
        if(node.left!=null){
            queue.add(node.left);//存入左节点入队
        }
        if(node.right!=null){
            queue.add(node.right);//存入右节点入队
        }
    }
}

后序遍历非递归

public static void LRD(TreeNode node){//使用两个栈进行处理,代码看上去简单易懂
    Stack<TreeNode> stack1 = new Stack<>();
    Stack<TreeNode> stack2 = new Stack<>();
    stack1.push(node);//根节点入栈
    TreeNode tempNode = null;
    while(!stack1.isEmpty()){
        tempNode = stack1.pop();
        if (tempNode.left != null) {
            stack1.push(tempNode.left);
        }
        if (tempNode.right != null) {
            stack1.push(tempNode.right);
        }
        stack2.push(tempNode);
    }
    while (!stack2.isEmpty()) {
        System.out.print(stack2.pop().val+" ");
    }
}

猜你喜欢

转载自blog.csdn.net/qq_35508033/article/details/89041242