分解让复杂问题简单化-面试题27-二叉搜索树与双向链表

来源:互联网 发布:大学软件工程项目 编辑:程序博客网 时间:2024/05/17 07:10

题目描述

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


解法:

如下图所示,找到左子树的最右结点,该结点和根结点形成双向链表,接着找到右子树的最左结点,根结点与该结点形成双向链表,递归


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)    {        if(pRootOfTree==NULL)            return NULL;        if(pRootOfTree->left==NULL && pRootOfTree->right==NULL)            return pRootOfTree;        TreeNode* pLeftRoot=Convert(pRootOfTree->left);   //left List        TreeNode* pLeftNode=pLeftRoot;        while(pLeftNode!=NULL && pLeftNode->right!=NULL){            pLeftNode=pLeftNode->right;        }   //定位到左子树的最右边的结点        if(pLeftRoot){            pLeftNode->right=pRootOfTree;            pRootOfTree->left=pLeftNode;        }  //如果左子树链表不为空的话,将当前root和左子树的最右边的结点形成双向关系        TreeNode* pRightRoot=Convert(pRootOfTree->right); //right List        TreeNode* pRightNode=pRightRoot;        while(pRightNode!=NULL && pRightNode->left!=NULL){           pRightNode=pRightNode->left;         }  //定位到右子树的最左边的结点        if(pRightRoot){            pRootOfTree->right=pRightNode;            pRightNode->left=pRootOfTree;        }  //如果右子树链表不为空的话,将当前root和右子树的最左边的结点形成双向关系        if(pLeftRoot)            return pLeftRoot;        else            return pRootOfTree;    }};


0 0
原创粉丝点击