1、二叉搜索树转有序双向链表
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
#include <iostream>
#include <list>
#include <stack>
using namespace std;
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 *root = pRootOfTree;
TreeNode *p = pRootOfTree;
TreeNode *q = p;
bool isFirst = true;
stack<TreeNode*> s;
/* 使用辅助栈中序遍历*/
while (p != NULL || !s.empty())
{
while(p != NULL)
{
s.push(p);
p = p->left;
}
p = s.top();//当前结点 无左子树
s.pop();
//当前结点加入双向链表
if(isFirst)
{
root = p;// 将中序遍历序列中的第一个节点记为root
q = root;
isFirst = false;
}
else
{
q->right = p;
p->left = q;
q = p;
}
p = p->right;//关键 下一循环遍历当前结点右孩子的左子树
}
return root;
}
};