#include <iostream>
using namespace std;
struct TreeNode {
int value;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x):value(x),left(NULL),right(NULL){};
};
class Solution{
public:
TreeNode* Convert(TreeNode* pRootOfTree) {
TreeNode *pPreTreeNode = NULL;
ConvertNode(pRootOfTree, &pPreTreeNode);//如果输入的pRootOfTree = NULL需要输入合法性检查
TreeNode *pHeadNode = pPreTreeNode;
while (pHeadNode != NULL && pHeadNode->left != NULL)
{
pHeadNode = pHeadNode->left;
}
return pHeadNode;
}
void ConvertNode(TreeNode *pCurrentTreeNode, TreeNode **pPreTreeNode) {
if (pCurrentTreeNode == NULL) {
//输入pRootOfTree = NULL输入合法性检查
return;
}
if (pCurrentTreeNode->left != NULL) {
ConvertNode(pCurrentTreeNode->left, pPreTreeNode);
}
pCurrentTreeNode->left = *pPreTreeNode;
if (*pPreTreeNode != NULL) {//中序遍历根节点的左子树的第一个叶子节点出现时,pPreTreeNode=NULL,如果操作(*pPreTreeNode)->right会报错
(*pPreTreeNode)->right = pCurrentTreeNode;
}
*pPreTreeNode = pCurrentTreeNode;
if (pCurrentTreeNode->right != NULL) {
ConvertNode(pCurrentTreeNode->right, pPreTreeNode);
}
}
};
int main(void)
{
TreeNode p1(10), p2(6), p3(14), p4(4), p5(8), p6(12), p7(16);
p1.left = &p2;
p1.right = &p3;
p2.left = &p4;
p2.right = &p5;
p3.left = &p6;
p3.right = &p7;
TreeNode *Head = NULL;
Solution s;
Head = s.Convert(&p1);
return 0;
}
二叉树中序遍历成双向链表
最新推荐文章于 2024-05-15 12:15:32 发布