剑指第二版第36题二叉搜索树转换为双向循环链表
感悟:
- 对于任何数据结构,基本的操作无非就是遍历+访问,具体一点就是增删改查
- 二叉树的前中后序遍历就是对操作的顺序不同,前序的的时候,我们只知道当前节点的属性,只可以对当前节点进行操作,中序遍历,左子节点已经操作忘了,我们可以根据题目的要求找出两个节点之间的对应关系,完成题目,比如这个题目,我们就是一直在操作两个节点,pre和cur,后续遍历就是已经得到了他的左子节点和右子节点,然后根据关系求值,比如二叉树的最大路径和,二叉树的最大深度,
简单的思路分析和框架构建:
- 二叉搜索树中序遍历是有序的.
- 所以我们在转换的时候,一定是在中序遍历的位置进行操作,中序遍历我们可以得到两个节点,当pre == null的时候 就说明我们到达了左子树的最左边,head = cur 最终返回这个节点,当pre != null的时候,pre.right = cur 串联在一起,
- 移动对应的指针,返回我们要操作的上一个栈空间
class Solution {
Node pre,head,cur;
public Node treeToDoublyList(Node root) {
//说真的,你别说,我忽然就发现这题目没有这么的难做呢
if (root == null){
return root;
}
cur = root;
dfs(cur);
head.left = pre;
pre.right = head;
return head;
}
void dfs(Node cur){
if (cur == null){
return;
}
dfs(cur.left);
if (pre == null){
head = cur;
}else{
pre.right = cur;
}
cur.left = pre;
pre = cur;
dfs(cur.right);
}
}