OJ【二叉搜索树与双向链表】


二叉搜索树的概念:

对于树上任意节点,满足左子树中所有节点的值都小于根节点的值,根节点对应的值都小于右子树中所有节点对应的值;
二叉搜索树的中序遍历是有序的;

题目描述:

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

思路:

- 判断当前二叉搜索树是否为空树,空树直接返回null;
- 判断当前二叉搜索树是否为叶子节点,是则直接返回叶子节点;
- 根据二叉搜索树中序遍历是有序的,找到二叉搜索树左子树的尾巴;
- 如果二叉搜索树左子树非空,则将其尾巴节点和根节点拼接起来;
- 如果二叉搜索树右子树非空,则将根节点和右子树拼接起来;
- 最终若二叉搜索树左子树为空,则返回根节点,反之返回左子树对应节点;

代码如下:

class TreeNode{
    public int val;
    public TreeNode left;
    public TreeNode right;

    public TreeNode(int val) {
        this.val = val;
    }
}
public class Solution {
    public TreeNode Convert(TreeNode pRootOfTree) {
      if (pRootOfTree == null){
          return null;
      }
      if (pRootOfTree.left == null && pRootOfTree.right == null){
          return pRootOfTree;
      }
      TreeNode left = Convert(pRootOfTree.left);
      TreeNode leftTail = left;
      //找到左子树的尾巴节点
        while (left != null && leftTail.right != null){
            leftTail = leftTail.right;
        }
        //如果左子树非空,则将左子树的尾巴节点和根节点拼接起来
        if (left != null){
            leftTail.right = pRootOfTree;
            pRootOfTree.left = leftTail;
        }
        TreeNode right = Convert(pRootOfTree.right);
        //如果右子树非空,则将根节点和右子树拼接起来
        if (right != null){
            pRootOfTree.right = right;
            right.left = pRootOfTree;
        }
        return (left==null)?pRootOfTree:left;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值