剑指第二版第36题二叉搜索树转换为双向循环链表

剑指第二版第36题二叉搜索树转换为双向循环链表

感悟:

  1. 对于任何数据结构,基本的操作无非就是遍历+访问,具体一点就是增删改查
  2. 二叉树的前中后序遍历就是对操作的顺序不同,前序的的时候,我们只知道当前节点的属性,只可以对当前节点进行操作,中序遍历,左子节点已经操作忘了,我们可以根据题目的要求找出两个节点之间的对应关系,完成题目,比如这个题目,我们就是一直在操作两个节点,pre和cur,后续遍历就是已经得到了他的左子节点和右子节点,然后根据关系求值,比如二叉树的最大路径和,二叉树的最大深度,

简单的思路分析和框架构建:

  1. 二叉搜索树中序遍历是有序的.
  2. 所以我们在转换的时候,一定是在中序遍历的位置进行操作,中序遍历我们可以得到两个节点,当pre == null的时候 就说明我们到达了左子树的最左边,head = cur 最终返回这个节点,当pre != null的时候,pre.right = cur 串联在一起,
  3. 移动对应的指针,返回我们要操作的上一个栈空间
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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值