每日一题 0209

(2022.02.09) 二叉树(labuladong版)

昨天属于是被困难题打击到了,难受。

但是昨天继续左程云加看书,复习二叉树。

今日看左程云,写二叉树,复习二叉树。

//第226题 翻转二叉树
/**
 * 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:
    TreeNode* invertTree(TreeNode* root) {
        if(root == nullptr){
            return nullptr;
        }
        TreeNode* temp = root->left;
        root->left = root->right;
        root->right = temp;
        invertTree(root->left);
        invertTree(root->right);
        return root;
    }
};


//第116题 填充每个节点的下一个右侧节点
//二叉树的问题难点在于,如何把题目的要求细化成每个节点需要做的事情。
//要充分利用已有的信息,记得思路的转换
class Solution {
public:
    Node* connect(Node* root) {
        if(root == NULL){
            return root;
        }
        connectTwoNode(root->left,root->right);
        return root;
    }
    Node* connectTwoNode(Node* Node1,Node* Node2){
        if(Node1 ==NULL || Node2 == NULL){
            return NULL;
        }
        Node1->next = Node2;
        connectTwoNode(Node1->left,Node1->right);
        connectTwoNode(Node2->left,Node2->right);
        connectTwoNode(Node1->right,Node2->left);
        return NULL;
    }

};

//第114题 二叉树展开为链表
//说不清楚,但是只要知道flatten 的定义如此,相信这个定义,让 root 做它该做的事情,然后 flatten 函数就会按照定义⼯作。(确实,有时候过分抓细节,就会脑抽,我就是典型)
//另外注意递归框架是后序遍历,因为我们要先拉平左右⼦树才能进⾏后续操作。
class Solution {
public:
    void flatten(TreeNode* root) {
        if(root == nullptr || (root->left == nullptr && root->right == nullptr)){
            return;
        }
        flatten(root->left);
        flatten(root->right);

        TreeNode* temp_left = root->left;
        TreeNode* temp_right = root->right;

        root->right = root->left;
        root->left = nullptr;

        TreeNode* p = root;
        while(p->right != nullptr){
            p = p->right;
        }
        p->right = temp_right;
}
};
上一篇:1644. Lowest Common Ancestor of a Binary Tree II


下一篇:【每日一题】【dfs重载原始函数&循环/函数结束条件&左右下标在数组中位置的确定】2022年2月7日-NC12 由先序和中序遍历重建二叉树