二叉搜索树与双向链表

题目描述:

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


问题分析:

在二叉树中,每个节点都有两个指向子节点的指针;同样,在双向链表中,每个节点也有两个指针。这两种数据结构相似,是有可能实现二叉搜索树与双向链表的转化的。

在搜索二叉树中,左子节点总是小于父节点的,右子节点总是大于父节点的,因此在转换的时候,原先指向左子节点的指针调整为链表中指向前一个节点的指针,原先指向右子节点的指针调整为链表中指向后一个节点指针。所以,我们就有了解题思路。

把根节点与左右子树分开,找到左子树最大的节点pleft,pleft.right指向根节点root,root.left指向pleft;找到右子树最小的节点pright,pright.left指向root,root.right指向pright;然后左子树与右子树的处理方法与上面一样,对其进行递归。


参考代码如下:

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }
}
*/
public class TreeNodeConvertList {
    public TreeNode Convert(TreeNode pRootOfTree) {
        if(pRootOfTree==null)
            return null;
        pRootOfTree=ConvertTreeNode(pRootOfTree);
        while( pRootOfTree.left!=null)
            pRootOfTree=pRootOfTree.left;
        return pRootOfTree;
    }
    
    public TreeNode ConvertTreeNode(TreeNode root){
        if(root==null)
            return null;
        if(root.left!=null){
            TreeNode left=ConvertTreeNode(root.left);
            //找到左子树中最大的节点,然后与root根节点连接
            while(left.right!=null)
                left=left.right;
            left.right=root;
            root.left=left;
        }
        if(root.right!=null){
            TreeNode right=ConvertTreeNode(root.right);
            //找到右子树中最小的节点,然后与root根节点连接
            while(right.left!=null)
                right=right.left;
            right.left=root;
            root.right=right;
            
        }
        return root;
    }
    
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值