• 二叉树与双向链表的转换


    题目描述

    输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
     
    分析:二叉搜索树要转成有序的链表,可以想到的是利用中序遍历二叉树,每得到一个输出结点就修改其指针指向,从而构成有序链表。
     
    题解:
    /*
    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)
        {
            if(pRootOfTree == nullptr)    return nullptr;
            // 非递归算法,故用堆栈
            stack<TreeNode*> sck;
            TreeNode *pCur = pRootOfTree;
            TreeNode *pNode = nullptr;        // 存储前一个输出结点
            TreeNode *pHead = nullptr;        // 存储有序链表表头
            while(!sck.empty() || pCur != nullptr) {
                
                while(pCur != nullptr) {
                    sck.push(pCur);
                    pCur = pCur->left;
                }
                pCur = sck.top();
                // 处理输出结点
                if(pNode != nullptr) {
                    pNode->right = sck.top();
                    sck.top()->left = pNode;
                    pNode = sck.top();
                }
                if(pNode == nullptr) {
                    pNode = sck.top();
                    pHead = pNode;
                }
                pNode = sck.top();
                sck.pop();
                
                if(pCur->right) {
                    pCur = pCur->right;
                }
                else {
                    pCur = nullptr;
                }
            }
            return pHead;
        }
    };
    

      

  • 相关阅读:
    Windows 网络监测ping IP输出时间
    python
    遇见问题汇总
    在路上积累
    Condition
    ReentrantReadWriteLock
    AbstractQueuedSynchronizer
    jmeter使用
    使用VisualVM监控java进程
    CNVD漏洞证书(2)
  • 原文地址:https://www.cnblogs.com/xzxl/p/9611161.html
Copyright © 2020-2023  润新知