按中序遍历的顺序展开
添加链接描述
中序遍历树,记录前一个节点和当前节点,改变二者的指针关系即可
class Solution {
TreeNode pre=null;
TreeNode head=null;
public TreeNode increasingBST(TreeNode root) {
convertTree2List(root);
return head;
}
private void convertTree2List(TreeNode root) {
if (root==null){
return;
}
convertTree2List(root.left);
if (pre==null){
head=root;
}else {
pre.right=root;
root.left=null;
}
pre=root;
convertTree2List(root.right);
}
}
c++:
class Solution {
public:
TreeNode* pre;
TreeNode* head;
TreeNode* increasingBST(TreeNode* root) {
if(root==nullptr){
return nullptr;
}
dfs(root);
return head;
}
void dfs(TreeNode* root){
if(root==nullptr){
return;
}
dfs(root->left);
if(pre==nullptr){
head=root;
}else{
pre->right=root;
root->left=nullptr;
}
pre=root;
dfs(root->right);
}
};
按先序遍历的顺序展开
114. 二叉树展开为链表
不能像上题那样,用先序遍历记录pre节点了。
class Solution {
public void flatten(TreeNode root) {
if (root==null){
return;
}
flatten(root.left);
flatten(root.right);
if (root.left==null){
//左孩子为空,没有展开的必要了
return;
}
TreeNode p=root.left;
while (p.right!=null){
p=p.right;
}
p.right=root.right;
root.right=root.left;
root.left=null;
}
}
c++:
class Solution {
public:
void flatten(TreeNode* root) {
if(root==nullptr){
return ;
}
flatten(root->left);
flatten(root->right);
if(root->left!=nullptr){
TreeNode* p=root->left;
while(p->right!=nullptr){
p=p->right;
}
p->right=root->right;
root->right=root->left;
root->left=nullptr;
}
}
};