欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

剑指offer面试题36---二叉搜索树与双向链表

程序员文章站 2022-05-06 21:37:59
...

1.题目描述:

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

2.通过书上一个例子的图形象描述下:

 剑指offer面试题36---二叉搜索树与双向链表

3.代码实现

//一开始我想到的是:中序遍历然后把节点依次用左右指针连起来即可,没有象书中讲的那么麻烦的方法 ,不过书中的这种递//  //归的方法还是值得练习的

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
#include <vector>

class Solution {
public:
    vector<TreeNode*> Vec;//思路是:中序遍历pRootOfTree,且把每次访问的节点放入Vec数组,最后把Vec中元素用双向指针连起来
    void Midorder(TreeNode* pRootOfTree)//这个函数实现中序遍历并把节点按顺序放入Vec
    {
         if(pRootOfTree==nullptr)
              return;
        
         else
         {
              Midorder(pRootOfTree->left);
              Vec.push_back(pRootOfTree);
              Midorder(pRootOfTree->right);
         }
    }
    
    
    
    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        if(pRootOfTree==nullptr)
            return nullptr;
        Midorder(pRootOfTree);
        vector<TreeNode*>::iterator cur;
    for(cur=Vec.begin();cur!=Vec.end();++cur)
    {
        if(cur==(Vec.end()-1))
            break;
        
         (*cur)->right=(*(cur+1));
        (*(cur+1))->left=(*cur);
    }
    
        return Vec[0];
    }
};