美文网首页
二叉搜索树与链表

二叉搜索树与链表

作者: lyoungzzz | 来源:发表于2017-08-22 21:01 被阅读10次

    题目描述:

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

    代码实现:

    /**
    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;
    
        public TreeNode(int val) {
            this.val = val;
    
        }
    
    }
    */
    //解题思路:
    //1.将左子树构造成双链表,并返回链表头节点。
    //2.定位至左子树双链表最后一个节点。
    //3.如果左子树链表不为空的话,将当前root追加到左子树链表。
    //4.将右子树构造成双链表,并返回链表头节点。
    //5.如果右子树链表不为空的话,将该链表追加到root节点之后。
    //6.根据左子树链表是否为空确定返回的节点。
    public class Solution {
        // 记录子树链表的最后一个节点,终结点只可能为只含左子树的非叶节点与叶节点
        TreeNode leftLast = null;
        public TreeNode Convert(TreeNode pRootOfTree) {
        //public TreeNode Convert(TreeNode root) {
            if(pRootOfTree == null)
                return null;
            if(pRootOfTree.left == null&&pRootOfTree.right == null){
                leftLast = pRootOfTree;// 最后的一个节点可能为最右侧的叶节点
                return pRootOfTree;
            }
            // 1.将左子树构造成双链表,并返回链表头节点
            TreeNode left = Convert(pRootOfTree.left);
            // 3.如果左子树链表不为空的话,将当前root追加到左子树链表
            if(left!=null){
                leftLast.right = pRootOfTree;
                pRootOfTree.left = leftLast;
            }
            leftLast = pRootOfTree;// 当根节点只含左子树时,则该根节点为最后一个节点
            // 4.将右子树构造成双链表,并返回链表头节点
            TreeNode right = Convert(pRootOfTree.right);
            // 5.如果右子树链表不为空的话,将该链表追加到root节点之后
            if(right!=null){
                right.left = pRootOfTree; 
                pRootOfTree.right = right;
            }
            if (left != null) {
                return left;
            }
            return pRootOfTree;
        }
    }
    

    相关文章

      网友评论

          本文标题:二叉搜索树与链表

          本文链接:https://www.haomeiwen.com/subject/ukcrdxtx.html