ZJ26_二叉搜索树与双向链表
知识点:二叉树、链表、分治
题目链接
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
解题思路
- 采用中序遍历 把结点都放入一个数组中保存 然后再把他们连起来
- 不用数组 用一个pre结点保存前一个结点 直接在中序遍历 把他们连起来
代码
#include "cheader.h"
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
class Solution1 {
public:
TreeNode* Convert(TreeNode* pRootOfTree) {
if(pRootOfTree == nullptr)
return nullptr;
vector<TreeNode*> v;
pushNode(v,pRootOfTree);
TreeNode* pre = v[0];
for(int i = 1; i < v.size();i++){
TreeNode *cur = v[i];
cur->left = pre;
pre->right = cur;
pre = cur;
}
return v[0];
}
void pushNode(vector<TreeNode*>& v,TreeNode *root){
if(root == nullptr)
return;
pushNode(v, root->left);
v.push_back(root);
pushNode(v, root->right);
}
};
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node() {}
Node(int _val) {
val = _val;
left = NULL;
right = NULL;
}
Node(int _val, Node* _left, Node* _right) {
val = _val;
left = _left;
right = _right;
}
};
*/
class Solution {
public:
Node* pre,*head;
Node* treeToDoublyList(Node* root) {
if(root == NULL)
return root;
dfs(root);
head->left = pre;
pre->right = head;
return head;
}
void dfs(Node* root){
if(root == NULL)
return;
dfs(root->left);
if(pre == NULL)
head = root;
else
pre->right = root;
root->left = pre;
pre = root;
dfs(root->right);
}
};
今天也是爱zz的一天!