二叉树的前序遍历——非递归版本

时间:2024-10-05 07:22:57

1.题目解析

题目来源:144.二叉树的前序遍历——力扣

测试用例

2.算法原理 

前序遍历: 按照根节点->左子树->右子树的顺序遍历二叉树 

二叉树的前序遍历递归版本十分简单,但是如果树的深度很深会有栈溢出的风险,这里的非递归版本可以很好的规避这个缺点,这里的思路是运用栈与子问题套子问题

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) {}
 * };
 */
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) 
    {
        vector<int> v;
        stack<TreeNode*> st;
        TreeNode* cur = root;

        while(cur || !st.empty())
        {
            //依次访问从最头结点向下遍历的左子树并入栈
            //当访问到底时向上取出栈内节点,访问其右子树
            //以此类推访问到整棵二叉树
            while(cur)
            {
                v.push_back(cur->val);
                st.push(cur);
                cur = cur->left;
            }

            //此时需要访问栈顶节点的右子树
            TreeNode* top = st.top();
            st.pop();

            cur = top->right;
        }
        return v;
    }
};