zoukankan      html  css  js  c++  java
  • 二叉树与双向链表的转换

    题目描述

    输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
     
    分析:二叉搜索树要转成有序的链表,可以想到的是利用中序遍历二叉树,每得到一个输出结点就修改其指针指向,从而构成有序链表。
     
    题解:
    /*
    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;
        }
    };
    

      

  • 相关阅读:
    论语言思维的差异
    lua经典问题
    跳槽的故事
    未来一年计划
    腾讯面试题 找重复的数
    nodejs学习
    node记录
    mysql 常用总结
    ubuntu 服务器搭建汇总
    ubuntu下安装golang
  • 原文地址:https://www.cnblogs.com/xzxl/p/9611161.html
Copyright © 2011-2022 走看看