• 剑指offer——二叉搜索树与双向链表


    二叉搜索树与双向链表

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

    利用中序遍历法,记录一个前驱结点,然后将当前结点的左孩子指向前驱节点,这样的话,向左<---表示逆序,然后将前驱结点的右孩子指向当前节点-->,可以形成正序。

    在这里记录的前驱节点不能在方法内部传递,不知道为什么

    /**
    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;
        public TreeNode(int val) {
            this.val = val;
        }
    }
    */
    public class Solution {
        TreeNode pre = null;
        public TreeNode Convert(TreeNode pRootOfTree) {
            if(pRootOfTree == null) return null;
            inOrder(pRootOfTree);
            TreeNode res = pRootOfTree;
            while(res.left != null){
                res = res.left;
            }
            return res;
        }
        public void inOrder(TreeNode root){
            if(root == null) return;
            inOrder(root.left);
            if(pre == null){
                pre = root;
            }else{
                pre.right = root;
                root.left = pre;
                pre = root;
            }
            inOrder(root.right);
        }
    }
    

      

    这样就不对,但是看C++的代码就是这样的,而且运行也正确,想不通

    public class Solution {
        public TreeNode Convert(TreeNode pRootOfTree) {
            TreeNode pre = null;
            inOrder(pRootOfTree, pre);
            TreeNode res = pRootOfTree;
           while(res.left!= null){
               res = res.left;
           }
            return res;
        }
         
        public void inOrder(TreeNode root, TreeNode pre){
            if(root == null) return;
            inOrder(root.left, pre);
            root.left = pre;
            if(pre != null) pre.right = root;
            pre = root;
            inOrder(root.right, pre);
        }
    }
    

      

     可以AC的C++代码

    class Solution {
    public:
        TreeNode* Convert(TreeNode* pRootOfTree)
        {
            if(pRootOfTree == nullptr) return nullptr;
            TreeNode* pre = nullptr;
              
            convertHelper(pRootOfTree, pre);
              
            TreeNode* res = pRootOfTree;
            while(res ->left)
                res = res ->left;
            return res;
        }
          
        void convertHelper(TreeNode* cur, TreeNode*& pre)
        {
            if(cur == nullptr) return;
              
            convertHelper(cur ->left, pre);
              
            cur ->left = pre;
            if(pre) pre ->right = cur;
            pre = cur;
              
            convertHelper(cur ->right, pre);
        }
    };
    

      

  • 相关阅读:
    神经网络量化入门--激活函数
    自我介绍+软工五问
    Myapp
    自我介绍+软工5问
    需求改进&系统设计
    团队展示&选题
    结对编程(java实现)
    个人项目-wc
    自我介绍+软工5问
    团队项目介绍
  • 原文地址:https://www.cnblogs.com/SkyeAngel/p/8680920.html
Copyright © 2020-2023  润新知