11.4算法(树的基本)

6.2非递归遍历

class Solution {//前序
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> st;
        if(root==NULL) return result;
        st.push(root);
        while(!st.empty()){
            TreeNode* bt;
            bt = st.top();
            st.pop();
            result.push_back(bt->val);
            if(bt->left) st.push(bt->left);
            if(bt->right) st.push(bt->right);
        }
        //后序遍历只要翻转
        //reverse(result.begin(),result.end());
        return result;
    }
};

//中序非递归
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> st;
        TreeNode* bt = root;
        while(bt||!st.empty()){
            if(bt){
                st.push(bt);
                bt = bt -> left;
            }
            else{
                bt = st.top();
                st.pop();
                result.push_back(bt->val);
                bt = bt -> right;
            }
        }
        return result;
    }
};

6.3二叉树的层次遍历

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        queue<TreeNode*> que;
        vector<vector<int>> result;
        if(root) que.push(root);//先将根结点放入队列
        while(!que.empty()){
            int size = que.size();
            TreeNode* bt;
            vector<int> vec;
            for(int i=0;i<size;i++){//上一个while入了几个左右孩子结点就循环几次
                bt = que.front();
                que.pop();
                vec.push_back(bt->val);
                if(bt->left) que.push(bt->left);
                if(bt->right) que.push(bt->right);
            }
            result.push_back(vec);
        }
        return result;
    }
};

6.4翻转二叉树

class Solution {//先序遍历
public:
    TreeNode* invertTree(TreeNode* root) {
        TreeNode* bt = root;
        if(!bt) return NULL;
        else{
            swap(bt->left,bt->right);
            invertTree(bt->left);
            invertTree(bt->right);
            return bt;
        }
    }
};

6.5对称二叉树

class Solution {
public:
    bool compare(TreeNode* left,TreeNode* right){
        if(left&&!right) return false;//左节点存在但是右节点不存在
        else if(!left&&right) return false;
        else if(!left&&!right) return true;//左右结点都不存在
        else if(left->val!=right->val) return false;//左右结点都存在但是其值不同

        bool isname;
        bool outside = compare(left->left,right->right);//外侧结点相比
        bool inside = compare(left->right,right->left);//内测结点相比
        return isname = outside&&inside;
    }

    bool isSymmetric(TreeNode* root) {
        if(!root) return true; 
        return compare(root->left,root->right);
    }
};
posted @ 2023-11-05 19:21  Ref-rain-  阅读(8)  评论(0)    收藏  举报