二叉搜索树与双向链表

本文探讨了如何将二叉树转换为链表,并详细解释了一种递归算法的实现过程。通过分别处理二叉树的左右子树,最终合并成一个链表,特别指出搜索二叉树可以转化为排序的双向链表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录


题目内容

尝试一

刚开始,找不到头绪,看了一下 讨论 的递归版。

result:答案正确:恭喜!您提交的程序通过了所有的测试用例
code:

/**
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;
         }
        
        /*分别求左子树的链表和右子树的链表*/
        TreeNode rear=myConvert(pRootOfTree.left,true);
        TreeNode head= myConvert(pRootOfTree.right,false);
        
        /*重置头节点*/
        pRootOfTree.left=null;
        pRootOfTree.right=null;
           
        /*合并链表*/
        if(rear!=null){
            rear.right=pRootOfTree;
            pRootOfTree.left=rear;
        }
        if(head!=null)
        {
            pRootOfTree.right=head;
            head.left=pRootOfTree;
        }
           
        /*遍历求出链表的头节点*/
        TreeNode i=pRootOfTree;
        while (pRootOfTree.left!=null){
            i=pRootOfTree.left;
            pRootOfTree=pRootOfTree.left;
        }
        return i;
    }


    /*
     * root:表示当前节点节点
     * toLeft:为true表示root是一个左节点。false:表示是一个右节点
     *
     */
    private TreeNode myConvert(TreeNode root,boolean toLeft){
        /*递归结束标识*/
        if(root==null){
            return null;
        }

        //往左走,就应该返回左半部分的链表的最后一个节点rear
        TreeNode rear= myConvert(root.left,true);

        /*rear为null就不做处理*/
        if(rear!=null){
            rear.right=root;
            root.left=rear;
        }

        //往右走,就应该返回有半部分的链表的第一个节点head
        TreeNode head=myConvert(root.right,false);

        /*head为null就不做处理*/
        if(head!=null){
            root.right=head;
            head.left=root;
        }

        /*toLeft就返回当前链表的最右一个节点rear.否则,就返回当前链表的最最一个节点*/
        //表示返回rear or head 节点
        TreeNode roh=root;
        if(toLeft){
            while(roh.right!=null){
                roh=roh.right;
            }
        }else{
            while(roh.left!=null){
                roh=roh.left;
            }
        }

        return roh;
    }
}

分析:分别求二叉树的左右子树对应的链表,然后将左右链表和root节点合并起来。

结论

  1. 二叉树这个结构可以转换为链表。并且搜索二叉树更是可以转换为一个排序好的双向链表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值