二叉树的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;
}
}
}