二叉树的Mirrors遍历

原本二叉树遍历 访问到 叶子节点的时候,是回不到 父节点的,所以说需要额外的空间来存储

Mirrors遍历的关键就在于 把 用于存储的额外空间 变为 遍历到头的叶子节点 再指向 父节点

leetcode里的动图就解释的很清晰了
Mirrors中序遍历

代码框架

while(cur){
    if(cur->left == NULL){// 左子树为空时,直接比较,然后进入右子树
        /*************
        /*  进行你的操作
        *************/
        pre = cur;
        cur = cur->right;
    }else{// 进入左子树
        /*************
        /* 找cur的前驱结点,找到后分两种情况
        /*   1、cur的左子结点没有右子结点,那cur的左子结点就是前驱
        /*   2、cur的左子结点有右子结点,就一路向右下,走到底就是cur的前驱
        *************/
        TreeNode* preceesor = cur->left;
        while(preceesor->right && preceesor->right != cur){
            preceesor = preceesor->right;
        }

        // 前驱已经指向自己了,直接比较,然后进入右子树
        if(preceesor->right == cur){
            /*************
            /*  进行你的操作
            *************/
            preceesor->right = NULL; // 断开连接,恢复原树
            pre = cur;
            cur = cur->right;
        }else{ // 前驱还没有指向自己,说明左边还没有遍历,将前驱的右指针指向自己,后进入前驱
            preceesor->right = cur;
            cur = cur->left;
        }
    }
}
posted @ 2020-09-24 10:38  miyanyan  阅读(641)  评论(0编辑  收藏  举报