• 二叉搜索树与双向链表


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

    思路:二叉搜索树中序遍历就是有序序列,把整个树拆成3部分,根,左子树,右子树。连接起来应该是,左子树的最右叶子节点的右指针指向根,根的左指针指向左子树最右节点,根的右指针指向右子树的最左节点,右子树的最左节点的左指针指向根。然后递归遍历。最后判断左子树的最左节点是否为null,如果为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;
            if(pRootOfTree.left == null && pRootOfTree.right == null)
                return pRootOfTree;
            
            TreeNode leftNode = Convert(pRootOfTree.left);
            TreeNode curNode = leftNode;
            //找到左子树最右边的叶子节点
            while(curNode != null && curNode.right != null) {
                curNode = curNode.right;
            }
            //连接根节点与左子树的最右叶子节点
            if(leftNode != null) {
                pRootOfTree.left = curNode;
                curNode.right = pRootOfTree;
            }
            
            //右子树的最左叶子节点
            TreeNode rightNode = Convert(pRootOfTree.right);
            //连接根节点与右子树的最左叶子节点
            if(rightNode != null) {
                pRootOfTree.right = rightNode;
                rightNode.left = pRootOfTree;
            }
            //考虑没有左子树的情况
            return leftNode==null?pRootOfTree:leftNode;
        }
    }
  • 相关阅读:
    2017上半年技术文章集合【Android】—184篇文章分类汇总
    一个高仿闲鱼键自定义数字键盘特效
    Android智能下拉刷新加载框架—看这些就够了
    深入了解Android蓝牙Bluetooth——《进阶篇》
    with和爬虫基础
    数据类型
    变量及注释
    计算机基础知识
    Markdown使用
    3732: Network
  • 原文地址:https://www.cnblogs.com/wxisme/p/5456558.html
Copyright © 2020-2023  润新知