题目

链接:226-翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
image.png

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
    }
};
解题思路
递归 - 前序 / 后序
递归 - 前序

递归三部曲:

  1. 确定参数及返回值:TreeNode* invertTree(TreeNode* root)
  2. 确定终止条件:if(root == NULL) return root;
  3. 确定单层递归逻辑:
swap(root->left, root->right)
invertTree(root->left);
invertTree(root->right);

image.png

完整代码:

#include <iostream>
#include <queue>
#include <vector>
using namespace std;

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

class Solution {
public:
    TreeNode* invertTree(TreeNode* root){
        if(root == nullptr) return root;
        swap(root->left, root->right);
        invertTree(root->left);
        invertTree(root->right);
        return root;
    }
};

void printTree(TreeNode* root){
    if(root == nullptr){
        cout << "empty tree" << endl;
        return;
    }
    
    queue<TreeNode*>que;
    que.push(root);

    while(!que.empty()){
        int size = que.size();
        for(int i = 0; i < size; i++){
            TreeNode* node = que.front();
            que.pop();

            cout << node->val << " ";

            if(node->left) que.push(node->left);
            if(node->right) que.push(node->right);
        }

        // cout << endl; 若需要显示不同的层,就加上该句,若不需要就不加
    }
}

int main(){
    
    TreeNode* root = new TreeNode(4);
    root->left = new TreeNode(2);
    root->right = new TreeNode(7);
    root->left->left = new TreeNode(1);
    root->left->right = new TreeNode(3);
    root->right->left = new TreeNode(6);
    root->right->right = new TreeNode(9);
    
    Solution obj;
    TreeNode* res = obj.invertTree(root);

    printTree(res);
    return 0;
}
递归 - 后序
class Solution {
public:
    TreeNode* invertTree(TreeNode* root){
        if(root == nullptr) return root;
        invertTree(root->left);
        invertTree(root->right);
        swap(root->left, root->right);
        return root;
    }
};

image.png

递归 - 中序 是不行的

在递归法中,是不能使用中序遍历的,会使得某些节点的右孩子翻转两次。
image.png

迭代法

该代码实现的是前序遍历:

class Solution {
public:
    TreeNode* invertTree(TreeNode* root){
        if(root == nullptr) return root;
        stack<TreeNode*> st;
        st.push(root);

        while(!st.empty()){
            TreeNode* node = st.top();
            st.pop();

            swap(node->left, node->right); 
            if(node->right) st.push(node->right);
            if(node->left) st.push(node->left);
        }
        return root;
    }
};
层序遍历
class Solution {
public:
    TreeNode* invertTree(TreeNode* root){
        queue<TreeNode*> que;
        if(root != nullptr) que.push(root);

        while(!que.empty()){
            int size = que.size();
            for(int i = 0; i < size; i++){
                TreeNode* node = que.front();
                que.pop();

                swap(node->left, node->right);
                if(node->left) que.push(node->left);
                if(node->right) que.push(node->right);
            }
        }
        return root;
    }
};

总结
从终端输入数组,层序遍历构建二叉树
#include <iostream>
#include <queue>
#include <vector>
#include <string>
#include <sstream>
using namespace std;

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

TreeNode* buildTree(vector<int>& vec){
    if(vec.empty() || vec[0] == -1) return nullptr;
    queue<TreeNode*>que;
    TreeNode* root = new TreeNode(vec[0]);
    que.push(root);
    
    int i = 1;
    int n = vec.size();
    while(!que.empty() && i < n){
        TreeNode* node = que.front();
        que.pop();

        if(vec[i] != -1){
            node->left =  new TreeNode(vec[i]);
            que.push(node->left);
        }

        i++;
        if(i >= n) break; // 提前终止
        
        if(vec[i] != -1){
            node->right = new TreeNode(vec[i]);
            que.push(node->right);
        }
        i++;
    }
    return root;
}

int main(){

    cout << "输入节点:";
    string input;
    getline(cin, input);

    vector<int> vec;
    istringstream iss(input);
    int num;
    while(iss >> num){
        vec.push_back(num);
    }
    
    TreeNode* root = buildTree(vec);
    return 0;
}

层序遍历打印输出二叉树
void printTree(TreeNode* root){
    if(root == nullptr){
        cout << "empty tree" << endl;
        return;
    }
    
    queue<TreeNode*>que;
    que.push(root);

    while(!que.empty()){
        int size = que.size();
        for(int i = 0; i < size; i++){
            TreeNode* node = que.front();
            que.pop();

            cout << node->val << " ";

            if(node->left) que.push(node->left);
            if(node->right) que.push(node->right);
        }

        // cout << endl; 若需要显示不同的层,就加上该句,若不需要就不加
    }
}
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐