leetcode Binary Tree Preorder Traversal Binary Tree Postorder Traversal Inorder Traversal

最近几天都没有在leetcode做题了,今天来了做了几个二叉树。发现二叉树的题目真的很多,都是些一般的基础。没有什么说的。找两个最近的题做了贴上吧。


前序遍历二叉树,这个没有什么说的。借助于堆栈可以轻松的实现。题目要求不用递归实现。

class Solution {
public:
    vector<int> preorderTraversal(TreeNode *root) {
        // IMPORTANT: Please reset any member data you declared, as
        // the same Solution instance will be reused for each test case.
    vector<int> vec;
    stack<TreeNode *> stk;
    if(!root)
        return vec;
    stk.push(root);
    while(stk.size())
    {
        TreeNode *t=stk.top();
        stk.pop();
        if(t->right)
            stk.push(t->right);
        if(t->left)
            stk.push(t->left);
        vec.push_back(t->val);
    }
    return vec;
    }
};

后序遍历二叉树,题目的要求还是不能使用递归。这都是数据结构的基础知识,也没有什么好说的。我使用的方法是自己开了两个堆栈,因为要记录一个结点是不是第一次出栈。如果是第一次出栈,说明子树没有遍历,将子树进栈。如果是第二次出栈说明子树已经遍历,直接出栈。用一个栈来模拟进栈出栈的过程,记录栈内结点进出栈的情况就可以了。代码也比较好理解。

class Solution {
public:
    vector<int> postorderTraversal(TreeNode *root) {
        // IMPORTANT: Please reset any member data you declared, as
        // the same Solution instance will be reused for each test case.
    vector<int> s;
        if(!root)
            return s;
        stack<TreeNode *> stk;
        stack<bool> stk_flag;
        stk.push(root);
        stk_flag.push(false);//第一次进栈
        while(stk.size())
        {
            TreeNode *t=stk.top();
            if(stk_flag.top())
            {
                s.push_back(t->val);
                stk.pop();
                stk_flag.pop();
                continue;
            }
            stk_flag.pop();
            stk_flag.push(true);//第二次进栈,将flag变为true
            if(t->right)
            {
                stk.push(t->right);
                stk_flag.push(false);
            }
            if(t->left)
            {
                stk.push(t->left);
                stk_flag.push(false);
            }
            if(!t->left && !t->right)
            {
                s.push_back(t->val);
                stk.pop();
                stk_flag.pop();
            }
        }
    return s;  
    }
};


顺便说下最近的足彩,太坑了。特别是圣日耳曼。害我输了好几次了。哈哈


顺便把中序的也贴一下。思想都比较简单没什么说的。

vector<int> inorderTraversal(TreeNode *root) {
        // IMPORTANT: Please reset any member data you declared, as
        // the same Solution instance will be reused for each test case.
    stack<TreeNode *> stk;
    vector<int> s;
    if(!root)
        return s;
    while(root)
    {
        stk.push(root);
        root=root->left;
    }
    while(stk.size())
    {
        TreeNode *t=stk.top();
        stk.pop();
        s.push_back(t->val);
        if(t->right)
        {
            TreeNode *p=t->right;
            while(p)
            {
                stk.push(p);
                p=p->left;
            }
        }
    }
    return s;
}




你可能感兴趣的:(LeetCode,数据结构,二叉树,非递归后续遍历,非递归前序遍历二叉树)