二叉树前中后序遍历(递归&迭代)

 

day14


二叉树

image-20230228191229082

image-20230228191239222

image-20230228191251745

// 二叉树的C++定义
struct TreeNode{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL),right(NULL) {}  
};

// 单链表定义
struct ListNode{
    int val;
    ListNode *node;
    ListNode(int x):val(x),next(NULL){}	//节点的构造函数
};

144.二叉树的前序遍历

题目链接:144. 二叉树的前序遍历

解题思路:递归法

1.确定递归函数的参数和返回值

2.确定终止条件

3.确定单调递归的逻辑

image-20230228194337768

/**
 * 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) {}
 * };
 */

//  C++中二叉树的代码实现
// struct TreeNode{
//     int val;
//     TreeNode *left;
//     TreeNode *right;
//     Treenode( int x ) : val(x),left(NULL),right(NULL){}
// };
class Solution {
public:

    // 前序遍历代码
    void Traversal( TreeNode *cur, vector<int>& vec){
        if( cur == NULL){
            return ;
        }
        vec.push_back( cur->val ); //中
        Traversal( cur->left , vec); //左
        Traversal( cur->right , vec); //右
    }
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> result;
        Traversal( root , result);
        return result;

    }
};

//迭代法进行前序遍历
/**
 * 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:

    vector<int> preorderTraversal(TreeNode* root) {
        // 定义栈存储二叉树节点
        stack<TreeNode*> st;
        vector<int> vec;
        if ( root == NULL ) return vec;
        st.push( root );
        while( !st.empty()){
            TreeNode* node = st.top();
            st.pop();
            // vec.push_back( node );
            if ( node != NULL ) vec.push_back( node->val ); //中
            else continue;
            st.push( node -> right );//右 先放右边的,再放左边的,因为栈是先入后出。
            st.push( node -> left ); //左
        }
        return vec;

    }
};

145.二叉树的后序遍历

题目链接:145. 二叉树的后序遍历

解题思路:递归法

1.确定递归函数的参数和返回值

2.确定终止条件

3.确定单调递归的逻辑

/**
 * 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) {}
 * };
 */

//  C++实现二叉树
// struct TreeNode{
//     int val;
//     TreeNode* left;
//     TreeNode* right;
//     TreeNode(int x): val(x),left(NULL),right(NULL){}
// };
class Solution {
public:

    // 后序遍历递归代码
    void Traversal( TreeNode* cur,vector<int>& vec){
        if ( cur == NULL){
            return;
        }
        Traversal( cur->left ,vec);
        Traversal( cur->right,vec);
        vec.push_back( cur->val );
    }

    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> result;
        Traversal( root,result );
        return result;

    }
};

//迭代法
/**
 * 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:
    vector<int> postorderTraversal(TreeNode* root) {

        stack<TreeNode*> st;
        vector<int> result;
        if ( root == NULL) return result;
        st.push( root );
        while( !st.empty()){
            TreeNode* node = st.top(); //存储栈顶元素
            st.pop();//弹出栈顶元素
            if ( node != NULL ){    //如果node不为空,将该值加到result中 相当于中
                result.push_back( node->val);
            }
            else continue;
            st.push( node->left);       //相当于左
            st.push( node->right);      //相当于右
        }
        // 参考前序遍历,反转结果 中左右->中右左->左右中 栈的不同
        reverse(result.begin(),result.end());
        return result;

    }
};

94.二叉树的中序遍历

题目链接:94. 二叉树的中序遍历

解题思路:递归法

1.确定递归函数的参数和返回值

2.确定终止条件

3.确定单调递归的逻辑

/**
 * 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) {}
 * };
 */

//  C++实现二叉树
// struct TreeNode{
//     int val;
//     TreeNode* left;
//     TreeNode* right;
//     TreeNode( int x):val(x),left(NULL),right(NULL){}
// };
class Solution {
public:

    // 定义中序遍历函数
    void Traversal( TreeNode* cur , vector<int>& vec){
        if ( cur == NULL){
            return;
        }
        Traversal( cur -> left,vec);
        vec.push_back( cur->val );
        Traversal( cur -> right,vec);
    }

    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        Traversal( root , result);
        return result;

    }
};


//迭代法的中序遍历
/**
 * 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) {}
 * };
 */

//  C++实现二叉树
// struct TreeNode{
//     int val;
//     TreeNode* left;
//     TreeNode* right;
//     TreeNode( int x):val(x),left(NULL),right(NULL){}
// };
class Solution {
public:

    // // 定义中序遍历函数
    // void Traversal( TreeNode* cur , vector<int>& vec){
    //     if ( cur == NULL){
    //         return;
    //     }
    //     Traversal( cur -> left,vec);
    //     vec.push_back( cur->val );
    //     Traversal( cur -> right,vec);
    // }

    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> st;
        TreeNode* cur = root;
        while( cur != NULL || !st.empty()){
            if ( cur != NULL){
                //指针访问节点,访问到最底层
                st.push(cur);//将访问的节点放进栈
                cur = cur->left; //左
            }else{
                cur = st.top();//从栈里弹出的数据,就是要处理的数据
                st.pop();
                result.push_back(cur->val); //中
                cur = cur->right;           //右
            }
        }
        return result;
    }
};

统一迭代法没看,二刷看