题目:输入一棵二叉查找树,将该二叉查找树换成一个排序的双向链表,要求不能创建任何新的节点,只能调整树中节点指针的指向。
解题思想:又一是道二叉树遍历算法的变型题,一定要往这个方向上面思考。此处采用中序遍历(主体)算法进行解题。
#include<iostream>
using namespace std;
struct TreeNode {
int val;
TreeNode* left, *right;
TreeNode(int x):val(x),left(nullptr),right(nullptr){}
};
//以下这个函数主体思想还是中序遍历
void convertNode(TreeNode* root,TreeNode* &pLastNodeInList) {
if (!root)
return ;
TreeNode* current = root;
//递归进左子树中
if (root->left)
convertNode(root->left, pLastNodeInList);
//将尾结点与当前结点连接,构建双向链表
current->left = pLastNodeInList;
if (pLastNodeInList)
pLastNodeInList->right = current;
pLastNodeInList = current;//将双向链表的尾节点更改为当前结点
//递归进右子树中
if (root->right)
convertNode(root->right,pLastNodeInList);
}
TreeNode* convert(TreeNode* root) {
if (!root)
return nullptr;
TreeNode* pLastNodeInList = nullptr;
convertNode(root, pLastNodeInList);
//由pLastNodeInList所指向开头的节点向左的链
while (pLastNodeInList->left) {
pLastNodeInList = pLastNodeInList->left;
}
return pLastNodeInList;
}
//验证部分
void Traverse(TreeNode* root) {
if (!root)
return;
cout << root->val << " ";
if (root->right)
Traverse(root->right);
}
int main() {
TreeNode a(10), b(6), c(14), d(4), e(8), f(12), g(16);
a.left = &b;
a.right = &c;
b.left = &d;
b.right = &e;
c.left = &f;
c.right = &g;
TreeNode* cur = convert(&a);
Traverse(cur);
return 0;
}