剑指offer之二叉搜索树与双向链表

题目

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

思路

二叉搜索树按照中序遍历即为递增排列,按照分治法的思路,我们只需调整左子树的最大节点与根节点的关系、根节点与右子树的最小节点的关系。具体分为三步:

1.最大节点在左子树中:递归调用左子树;

2.最大节点为根节点;

3.最大节点在右子树中:递归调用右子树;

其中,第一步需要注意当前最大节点为空的情况(lastNode==null)。第二步连接最大节点与根节点(两种情况)。

代码

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public TreeNode Convert(TreeNode pRootOfTree) {
        if(pRootOfTree==null){
            return null;
        }    
        helper(pRootOfTree,null);       
        TreeNode start=pRootOfTree;
        while(start.left!=null){
            start=start.left;
        }      
        return start;
    }
    
    private TreeNode helper(TreeNode pRootOfTree,TreeNode lastNode){
        //处理左子树,获得最大结点
        if(pRootOfTree.left!=null){
            lastNode=helper(pRootOfTree.left,lastNode);//1
        }
        //链接最大结点和根结点
        pRootOfTree.left=lastNode;
        if(lastNode!=null){
            lastNode.right=pRootOfTree;
        }
        //获得最大结点
        lastNode=pRootOfTree;//2
        //处理右子树,获得最大结点
        if(pRootOfTree.right!=null){
            lastNode=helper(pRootOfTree.right,lastNode);//3
        }
        return lastNode;
    }
}

测试用例

功能测试(普通二叉树;左/右斜树;一个节点)。

特殊输入测试 (根节点为null)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值