二叉树转化为双向链表(头尾不相连)
示图
注意:不创建任何新的结点,只能调整树中结点指针的指向,当转化完成以后,树中节点的左指针需要指向前驱,右节点需要指向后继节点
输入:{10,6,14,4,8,12,16}
输出:From left to right are:4,6,8,10,12,14,16;From right to left are:16,14,12,10,8,6,4;。
返回双向链表的头节点返回即可
思路:二叉搜索树特点:中序遍历之后的序列就是升序,所以对其进行中序遍历,然后将结点加入队列
中,之后逐个出队,先出队第一个元素(二叉树中最左侧元素),之后第一个元素的右孩子指向下一个元素,下一个元素的左孩子指向第一个元素;(这里的左孩子、右孩子分别是前驱节点、后继节点),之后将指针指向第一个孩子移动到第二个孩子,进行上述操作,直到队列为空
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
queue<TreeNode*> queue;
TreeNode* Convert(TreeNode* pRootOfTree) {
if (!pRootOfTree)
return nullptr;
Mid_sort(pRootOfTree);
TreeNode* head = queue.front();
queue.pop();
TreeNode* cur = head;
while (!queue.empty()) {
cout << queue.size() << endl;
TreeNode* p = queue.front();
queue.pop();
cur->right = p;
p->left = cur;
cur = p;
}
//如果首位相连接使用下述代码
// cur->right = head;
// head->left = cur;
return head;
}
//中序遍历
void Mid_sort(TreeNode* pRootOfTree) {
if (!pRootOfTree) return;
Mid_sort(pRootOfTree->left);
queue.push(pRootOfTree);
Mid_sort(pRootOfTree->right);
}
};