Binary Tree Preorder Traversal

来源:互联网 发布:love rosie知乎 编辑:程序博客网 时间:2024/05/06 23:12

之前估计是发生了间接性脑乱综合征,把问题搞得很复杂,其实问题本身非常简单,只要用一个栈来模拟函数调用栈即可,代码如下

/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    vector<int> preorderTraversal(TreeNode *root) {        vector<int> res;        stack<TreeNode*> stk;        if(!root)        {            return res;        }        stk.push(root);        TreeNode* tmp=NULL;        while(!stk.empty())        {            tmp=stk.top();            stk.pop();            res.push_back(tmp->val);            if(tmp->right)            {                stk.push(tmp->right);            }            if(tmp->left)            {                stk.push(tmp->left);            }        }        return res;    }};

下面是脑乱的记录。。。


树的前序遍历非递归形式。首先一定要用到栈,否则无法回溯回父节点,其次要知道接下来要访问栈中父节点的左子节点还是右子节点,如果能自定义树节点的数据结构的话,可以在其中加入一个标记位,代表左子节点是否已经访问过,这样只需要一个栈即可,每次拿到栈中父节点后,检查标志位,如果左子节点未访问,则修改标记位,不把自己移出栈,而是继续访问左子节点;如果标记已经表示左子节点访问过,则把自己移出栈,继续访问右子节点。

但这里无法给树节点加标记,只能采用两个栈的方法,把已经访问过左子节点的父节点加入第二个栈中以便再次访问右子节点


/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    vector<int> preorderTraversal(TreeNode *root) {        stack<TreeNode*> leftstk;        stack<TreeNode*> rightstk;        vector<int> res;        if(!root)        {            return res;        }        res.push_back(root->val);        leftstk.push(root);        TreeNode* tmp=NULL;        while(!leftstk.empty()||!(rightstk.empty()))        {            while(!leftstk.empty())            {                tmp=leftstk.top();                leftstk.pop();                if(tmp->left)                {                    res.push_back(tmp->left->val);                    leftstk.push(tmp->left);                }                rightstk.push(tmp);            }            if(!rightstk.empty())            {                tmp=rightstk.top();                rightstk.pop();                if(tmp->right)                {                    res.push_back(tmp->right->val);                    leftstk.push(tmp->right);                }            }        }        return res;            }};


0 0
原创粉丝点击