题目描述:根左右的遍历方式

方法1:递归

class Solution {
public:
    vector<int> vals;
    void pre_order(TreeNode* root){
        if(!root) return;
        vals.push_back(root->val);
        pre_order(root->left);
        pre_order(root->right);
    }
    vector<int> preorderTraversal(TreeNode* root) {
        pre_order(root);
        return vals;
    }
};

方法2:非递归方式,先入栈右子树,再入栈左子树,因为栈是先进后出(注意空节点是不入栈的)

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int>vals;
        stack<TreeNode*>stk;
        if(!root) return vals;
        stk.push(root);
        while(!stk.empty()){
            TreeNode* temp = stk.top();
            stk.pop();
            vals.push_back(temp->val);
            if(temp->right) stk.push(temp->right);
            if(temp->left) stk.push(temp->left);
        }
        return vals;
    }
};

和中序不一样,中序如下(与前序相似的写法):

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> temp;
        stack<TreeNode*> stk;
        if(!root) return temp;
        stk.push(root);

        TreeNode* a;

        while(!stk.empty()){
            if(root&&root->left){
                stk.push(root->left);
                root = root->left;
            }
            else{
                a = stk.top();
                temp.push_back(a->val);
                stk.pop();
                if(a->right){
                    stk.push(a->right);
                    root = a->right;
                }
            }
        }
        return temp;
    }
};