leetcode-144-Binary Tree Preorder Traversal

来源:互联网 发布:完美汽配软件 编辑:程序博客网 时间:2024/06/06 06:56
#include <iostream>#include <vector>#include <stack>using namespace std;//Definition for a binary tree node.struct TreeNode {    int val;    TreeNode *left;    TreeNode *right;    TreeNode(int x) : val(x), left(NULL), right(NULL) {}};/* 非递归实现,先用栈,按先序顺序呢将遍历到的元素push到vector里面,每遇到一个 元素先放到vector,然后检查是否有左儿子,有的话放到vector,然后再检查是否有 右儿子 *///class Solution {//public://    vector<int> preorderTraversal(TreeNode* root) {//        stack<TreeNode *> mystack;//        vector<int> myvec;//        if (root == NULL) {//            return myvec;//        }//        mystack.push(root);//        myvec.push_back(root->val);//        while (!mystack.empty()) {//            TreeNode *cur = mystack.top();//            //有左儿子,入栈//            if (cur->left) {//                mystack.push(cur->left);//                myvec.push_back(cur->left->val);//                cur->left = NULL;//            } else {//                //无左儿子,有右儿子//                if (cur->right) {//                    mystack.push(cur->right);//                    myvec.push_back(cur->right->val);//                    cur->right = NULL;//                } else {//                    //无左儿子,右儿子//                    mystack.pop();//                }//            }//        }//        return myvec;//    }//};/* 看了一个更好的实现,就按顺序的将根,右儿子,左儿子,压进栈,然后出栈的顺序 是跟,左儿子,右儿子,所有根要先出栈,然后在压进右儿子、左儿子。 *///class Solution {//public://    vector<int> preorderTraversal(TreeNode* root) {//        stack<TreeNode *> mystack;//        vector<int> myvec;//        if (root == NULL) {//            return myvec;//        }//        mystack.push(root);//        while (!mystack.empty()) {//            TreeNode *cur = mystack.top();//            mystack.pop();//            myvec.push_back(cur->val);//            if (cur->right) {//                mystack.push(cur->right);//            }//            if (cur->left) {//                mystack.push(cur->left);//            }//        }//        return myvec;//    }//};/* morris遍历,只用一个指针遍历即可不用栈,空间为O(1),时间为O(N), 将一颗左子树的最右的节点,指向它的根。在遍历右子树。如果没有左子树 就直接遍历cur,然后访问它的右子树;如果有左子树,就遍历这个节点,然后 访问左子树,并在左子树中寻找以这个节点为根的最后一个叶子节点,并将利用 第一种情况的特点将叶子节点的右儿子连着根,当访问完最后一个节点再访问根 的右子树。 */class Solution {public:    vector<int> preorderTraversal(TreeNode* root) {        vector<int> myvec;        TreeNode *cur = root;        while (cur) {            if (cur->left == NULL) {                myvec.push_back(cur->val);                cur = cur->right;            } else {                TreeNode *prev = cur->left;                while (prev->right && prev->right != cur) {                    prev = prev->right;                }                if (prev->right == NULL) {                    myvec.push_back(cur->val);                    //建立线索后,遍历左子树                    prev->right = cur;                    cur = cur->left;                } else {                    /*去掉线索,恢复树的结构,                     cur的左子树已全部遍历过了,                     遍历右子树                     */                    prev->right = NULL;                    cur = cur->right;                }            }        }        return myvec;    }};int main(int argc, const char * argv[]) {    TreeNode one = TreeNode(1);    TreeNode two = TreeNode(2);    TreeNode three = TreeNode(3);    one.right = &two;    two.left = &three;    Solution s;    vector<int> result = s.preorderTraversal(&one);    for (int i = 0; i < result.size(); i++) {        cout << result[i] << " ";    }    cout << endl;    return 0;}

0 0
原创粉丝点击