114. 二叉树展开为链表.
方法
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
void flatten(TreeNode* root) {
// 如果root为空,或者只有root本身一个元素而没有孩子节点,就直接return
if(root == nullptr || (!root->left && !root->right)){
return;
}
// 先中后序的遍历借助于栈
stack<TreeNode*> nodeStack;
// 先判断root的左右孩子入栈;因为要是直接把root入栈的话,弹出栈顶元素就是root,不方便再让root指向下一个元素。
//有右孩子的话先把右孩子入栈,然后再判断左孩子;这样出栈的时候就是先左后右的顺序了
if(root->right){
nodeStack.push(root->right);
}
if(root->left){
nodeStack.push(root->left);
}
// 前序遍历的大致流程,稍微修改
TreeNode* cur = root;
TreeNode* node = nullptr;
while(!nodeStack.empty()){
// 获取并弹出栈顶元素
node = nodeStack.top();
nodeStack.pop();
// 并将其作为上一个节点的右孩子
cur->left = nullptr;
cur->right = node;
cur = node;
// 前序遍历添加孩子的流程:
// 先将右孩子入栈:判断有没有右孩子,有的话就入栈;
// 再将左孩子入栈:判断有没有左孩子,有的话就入栈;
if(node->right){
nodeStack.push(node->right);
}
if(node->left){
nodeStack.push(node->left);
}
}
}
};
方法:递归
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
// 1.确定参数和返回值
void flatten(TreeNode* root) {
// 2.确定终止条件
if(root ==nullptr){
return;
}
// 3.确定本层的代码逻辑
// 将根节点的左右子树变成链表
flatten(root->left);
flatten(root->right);
// 将树的右边换成左边的链表
TreeNode* temp = root->right;
root->right = root->left;
// 左边要置为空
root->left = nullptr;
// 找到树的最右边的节点,把原来的右边的链表接到更新的树的最右边的节点上
while(root->right){
root = root->right;
}
root->right = temp;
}
};