二叉树的后序遍历(迭代版本)

二叉树的后序遍历相比较前序和中序复杂一些。我们需要一个标记来记忆我们此时节点上一个节点。

 

具体的java代码如下:

// 二叉树的后序遍历
public static void postOrderTraverWithStack(TreeNode node){
    Stack stack = new Stack<>();
    TreeNode treeNode = node;

    // 标记位
    TreeNode lastVisit = null;
    while(treeNode != null || !stack.isEmpty()){

        while(treeNode != null){
            stack.push(treeNode);
            treeNode = treeNode.leftChild;
        }
        // 栈不为空
        if(!stack.isEmpty()){
            // 出栈
            treeNode = stack.pop();
            /***
             * 这块就是判断treeNode是否有右孩子,
             * 如果没有输出treeNode.data, 让lastVisit指向treeNode, 并让treeNode为空
             * 如果有右孩子, 将当前节点继续入栈,treeNode指向它的有孩子,继续重复循环
             */
            // 这里其实是访问到根节点后有两条路径,一个是当没有右孩子或者右孩子被访问过后,
            // 打印根节点,另一个是右孩子没有被访问过,则把该根节点继续压入栈,访问右孩子。
            if(treeNode.rightChild == null || treeNode.rightChild == lastVisit){
                System.out.print(treeNode.data + " ");
                lastVisit = treeNode;
                treeNode = null;
            }
            else{
                stack.push(treeNode);
                treeNode = treeNode.rightChild;
            }
        }


    }


}

 

你可能感兴趣的:(C++,二叉树的遍历)