非递归实现二叉树遍历

一、非递归前序遍历
规则:中、左、右

在这里插入图片描述
基本思想:首先申请一个空栈,将root节点压入栈中,然后弹出root节点,将root节点的右子树(判断右子树是否存在)压入栈中,然后将左子树(判断左子树是否存在)压入栈中,再弹出左子树,重复上面的步骤,直到栈为空为止。

public void nonRecpreOrder(TreeNode1 Node){
        if(Node == null){
            return ;
        }
        Stack<TreeNode1> stack = new Stack<TreeNode1>();
        stack.push(Node);
        while(!stack.empty()){
            TreeNode1 n = stack.pop();
            System.out.println("Data"+ n.data);
            if(n.rightChild != null){
                stack.push(n.rightChild);
            }
            if(n.leftChild != null){
                stack.push(n.leftChild);
            }
        }
    }

二、非递归中序遍历
规则:左、中、右
在这里插入图片描述
基本思路:创建一个空栈,首先,将root节点压入栈中,(判断root是否存在子节点)将root节点的左子节点压入栈中,再将左子节点的左子节点压入栈中,直到左子节点为null,此时弹出一个节点,并判断其是否有右子节点,若有,则将该节点的右子节点压入栈中,重复上述过程。若无右子节点,则将继续弹出下一个节点,并判断其是否有右子节点。

public void nonRecmidOrder(TreeNode1 Node){
        if(Node == null){
            return ;
        }
        Stack<TreeNode1> stack = new Stack<>();    //创建一个新栈
        stack.push(Node);                          //将根节点放入栈中
        while(!stack.empty()){
            if(Node.leftChild != null){    //不断地遍历做左儿子
                Node = Node.leftChild;
                stack.push(Node);
            }
            else
            {
                TreeNode1 n = stack.pop();
                System.out.println("Data"+ n.data);
                if(n.rightChild != null){     //避免空指针
                    Node = n.rightChild;
                    stack.push(Node);
                }
            }
        }
    }

三、非递归后序遍历
规则:左、右、中
在这里插入图片描述
基本思路:申请两个栈,将root节点压入栈S1,然后弹出该节点,并将其压入S2栈,同时把该节点的左子节点、右子节点压入栈S1,再从栈S1中弹出一个节点,重复上述操作。最后,依次弹出并打印栈S2中内容,即为后序遍历结果。

public void nonlastOrder(TreeNode1 Node){
        Stack<TreeNode1> stack1 = new Stack<>();
        Stack<TreeNode1> stack2 = new Stack<>();
        stack1.push(Node);
        while(!stack1.empty()){
            TreeNode1 n = stack1.pop();
            stack2.push(n);
            if(n.leftChild != null){
                stack1.push(n.leftChild);
            }
            if(n.rightChild != null){
                stack1.push(n.rightChild);
            }
        }
        while(!stack2.empty()){         //打印栈stack2中内容
            TreeNode1 k = stack2.pop();
            System.out.println("Data is" + k.data);
        }
    }

猜你喜欢

转载自blog.csdn.net/weixin_43502661/article/details/86535547