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

    Question

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

    Solution

    • 因为树的每个节点都有两个指针,并且双向链表的节点也有两个指针,所以这个转换是可行的。

    • 首先是有序的链表,并且是二叉搜索树,那么我们可以想到用中序遍历

    • 左指针指向链表的前一个节点,右指针指向链表的下一个节点,其中需要一个指针指向链表的最后一个节点。

    Code

    /*
    struct TreeNode {
    	int val;
    	struct TreeNode *left;
    	struct TreeNode *right;
    	TreeNode(int x) :
    			val(x), left(NULL), right(NULL) {
    	}
    };*/
    class Solution {
    public:
        TreeNode* Convert(TreeNode* pRootOfTree) {
           // 记录链表中的最后一个节点
    		TreeNode* pLastNodeInList = NULL;
            ConvertCore(pRootOfTree, &pLastNodeInList);
            while (pLastNodeInList != NULL && pLastNodeInList->left != NULL)
                pLastNodeInList = pLastNodeInList->left;
            
            return pLastNodeInList;
        }
        void ConvertCore(TreeNode* pNode, TreeNode** pLastNodeInList) {
    		
            if (pNode == NULL)
                return;
            // 正在被访问的节点
            TreeNode* pCurrent = pNode;
            
            if (pCurrent->left != NULL) {
                ConvertCore(pCurrent->left, pLastNodeInList);
            }
            
            pCurrent->left = *pLastNodeInList;
            if (*pLastNodeInList != NULL)
                (*pLastNodeInList)->right = pCurrent;
            
            *pLastNodeInList = pCurrent;
            
            if (pCurrent->right != NULL)
                ConvertCore(pCurrent->right, pLastNodeInList);
        }
    };
    
  • 相关阅读:
    程序人生,编程思想
    CentOS Linux Jenkins安装、部署、更新
    Git常用命令
    U盘安装Mac OS X要点
    Shell执行*.sql
    WebStorm远程调试Node.js
    svn常用命令
    敏捷开发相关编辑思想(SOA、DDD、REST、CQRS)
    VisualVM远程监控Java
    centos搭建git服务
  • 原文地址:https://www.cnblogs.com/zhonghuasong/p/7097535.html
Copyright © 2011-2022 走看看