二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
leetcode真的狗,一份好好的代码交了十几次过不了,去牛客网一次就过了,呸呸呸。
#include<bits/stdc++.h>
using namespace std;
// Definition for a TreeNode.
class TreeNode {
public:
int val;
TreeNode* left;
TreeNode* right;
TreeNode() {}
TreeNode(int _val) {
val = _val;
left = NULL;
right = NULL;
}
TreeNode(int _val, TreeNode* _left, TreeNode* _right) {
val = _val;
left = _left;
right = _right;
}
};
TreeNode* dfs(TreeNode* root) {
if(root==NULL) return root;
TreeNode *leftNode = dfs(root->left);
TreeNode *rightNode = dfs(root->right);
if(leftNode != NULL) {
while(leftNode->right)
leftNode = leftNode->right;
leftNode->right = root;
}
if(rightNode != NULL) {
while(rightNode->left)
rightNode = rightNode->left;
rightNode->left = root;
}
root->left = leftNode;
root->right = rightNode;
return root;
}
TreeNode* treeToDoublyList(TreeNode* root) {
if(root == NULL) return root;
TreeNode *head = dfs(root);
while(head->left) {
head = head->left;
}
return head;
}
int main(){
TreeNode * head;
head = new TreeNode(4);
head->left = new TreeNode(2);
head->right = new TreeNode(5);
head->left->left = new TreeNode(1);
head->left->right = new TreeNode(3);
TreeNode *ans = treeToDoublyList(head);
while(ans) {
cout<<ans->val<<' ';
ans = ans->right;
}
cout<<endl;
}
傻逼题