题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。
要求不能创建任何新的结点,只能调整树中结点指针的指向。
注意:
需要返回双向链表最左侧的节点。
样例
思路
就在中序递归遍历的基础上改了一点点,用一个pre指针保存中序遍历的前一个结点。
因为是中序遍历,遍历顺序就是双线链表的建立顺序;
每一个结点访问时它的左子树肯定被访问过了,所以放心大胆的改它的left指针,不怕树断掉;
同理,pre指向的结点保存的数肯定小于当前结点,所以其左右子树肯定都访问过了,所以其right指针也可以直接改。
最后需要一直向左找到双向链表的头结点。
C++ 代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* pre = NULL;
TreeNode* convert(TreeNode* root) {
dfs(root);
while(root && root->left) root = root->left;
return root;
}
void dfs(TreeNode* root){
if(!root) return;
dfs(root->left);
root->left = pre;
if(pre) pre->right = root;
pre = root;
dfs(root->right);
}
};
这么写为啥不对呢
其实可以再用一个head指针,if(pre) pre->right = root; else head = root; 也就是说当pre为空时,当前结点就是头结点
嗯呢,也可以的
结点指针符不符合题目中的要求啊,题目中要求是不允许创建新结点,但是这是结点指针。。。
创建新结点是要new一个新结点,节点指针不是创建新结点哈
怎么感觉像是创建的新的节点一样。
是创建了pre节点,与题意不符了。
实在是太帅了!!!
果然排第一的题解就是无敌的存在!
大佬中序遍历玩明白了👍
强强强,大佬就是牛X,奈何本人没文化,一句牛逼行天下!
同样的代码,acwingAC了,lc样例空指针异常,为什么啊
lc的题目需要把头尾连接起来
女少口阿
厉害👍
女少!!!膜拜!弱弱地问一下,新建了pre是否违背题目中的要求:“要求不能创建任何新的结点,只能调整树中结点指针的指向”?
这个pre不算创建新的结点,因为并没有开辟空间去存一个新node,pre只是个指针,指向已有的结点的。
谢谢指点!!!
膜拜,太妙了
tql
妙啊,厉害
佩服
if(pre)pre->right=root;
else start=root;
这样就不用找头节点了(居然能改进大神的代码😀)
hhhh厉害厉害,我不是啥大神
厉害
厉害,受教了
哈哈过奖了,其实就是想偷懒,试试,没想到可以