标签:class == 题目 需要 递归函数 循环 第一个 root 定义
仅供自己学习
思路:
按照题目要求我们需要定义一个head头节点,并且因为树是二叉搜索树,所以要采取中序遍历才能得到从小到大的排序。
按照中序遍历的模板
dfs(root->left);
cout<<root->val;
dfs(root->right);
同样我们也通过这个模板写DFS,这里因为是双向的,所以需要一个pre来记录前一个结点。
首先判断root是否为空,不为空则进入dfs递归,dfs递归函数也需要判断传入的cur节点是否为空,如果不为空就再次进入dfs(cur->left),按照中序遍历模板。
然后递归出来之后判断pre是否为空,如果为空就将head指向cur,否则就pre->right=cur。为什么要有这几步判断呢,因为我们最开始定义head和pre都是空的,这个条件是为了head能指向第一个节点,之后都会是pre为非空就不会更改head了。然后将cur->left=pre,pre=cur,将cur->right传入dfs递归函数。这样就和中序遍历的模板一样。
当主函数dfs出来后,head指向了第一个节点,pre指向最后一个节点,那么我们在用head->left指向pre,pre->right指向head,即可完成双向循环链表。
代码:
/*
// 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; Node* head;
Node* dfs(Node* cur){
if(cur==NULL) return NULL;
dfs(cur->left);
if(pre!=NULL) pre->right=cur;
else head=cur;
cur->left=pre;
pre=cur;
dfs(cur->right);
return cur;
}
Node* treeToDoublyList(Node* root) {
if(root==NULL) return NULL;
dfs(root);
head->left=pre;
pre->right=head;
return head;
}
};
标签:class == 题目 需要 递归函数 循环 第一个 root 定义
原文地址:https://www.cnblogs.com/Mrsdwang/p/14613510.html