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;
        }
    }
  • 相关阅读:
    【洛谷P1948】[USACO08JAN]电话线
    【洛谷P1967】[NOIP2013]货车运输
    【题解】洛谷P2926 [USACO08DEC]拍头Patting Heads
    【题解】洛谷P1495 曹冲养猪 (中国剩余定理)
    【题解】POJ1845 Sumdiv(乘法逆元+约数和)
    【题解】P1516 青蛙的约会(Exgcd)
    【数论】同余问题
    DP Cleaning Up 打扫卫生
    set+链表 【POJ Challenge】生日礼物
    并查集 [Scoi2010]游戏
  • 原文地址:https://www.cnblogs.com/wxisme/p/5456558.html
Copyright © 2011-2022 走看看