题目大意
给定一个二叉树,原地将它展开为链表。
例如,给定二叉树
1
/ \
2 5
/ \ \
3 4 6
将其展开为:
1
\
2
\
3
\
4
\
5
\
6
解题思路
方法一:
递归,首先将左子树和右子树分别展开,然后将根节点的右子树替换为左子树并且左子树置为空,然后找到当前右子树的最右节点,连接原右子树即可。
class Solution {
public:
void flatten(TreeNode* root) {
if (!root){
return ;
}
// 将左子树和右子树展开
flatten(root->left);
flatten(root->right);
//保存一下右子树
TreeNode * tmp = root->right;
// 将展开的左子树放到右边,左子树为空
root->right = root->left;
root->left = nullptr;
// 找到最右节点,连接原右子树
while (root->right){
root = root->right;
}
root->right = tmp;
}
};
方法二:
非递归形式,采用栈来模拟递归,用中序遍历。
思想与方法一相同,直接见代码。
class Solution {
public:
void flatten(TreeNode* root) {
if (!root) return ;
stack<TreeNode*> mystack;
mystack.push(root);
TreeNode * tmp;
while (root || !mystack.empty()){
if (root){
mystack.push(root);
root = root->left;
}
else{
root = mystack.top(); mystack.pop();
tmp = root->right;
root->right = root->left;
root->left = nullptr;
while (root->right)
root = root->right;
root->right = tmp;
root = tmp;
}
}
}
};