zoukankan      html  css  js  c++  java
  • 二叉搜索树与双向链表

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

    思路:二叉搜索树中序遍历就是有序序列,把整个树拆成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;
        }
    }
  • 相关阅读:
    Objective-C Collection was mutated while being enumerated crash
    C++ assert断言
    Objective-C 禁用NSMenu中的系统services菜单项
    django----命令
    django----admin源码流程
    django----admin
    django----利用Form 实现两次密码输入是否一样 ( 局部钩子和全局钩子 )
    django----基于Form组件实现的增删改和基于ModelForm实现的增删改
    java----面试题
    课外知识----ini
  • 原文地址:https://www.cnblogs.com/wxisme/p/5456558.html
Copyright © 2011-2022 走看看