LinCode 二叉树的前中后遍历

二叉树的前中后序遍历,前序遍历,根左右;中序遍历,左根右;后续遍历,左右根。非递归

LinCode 二叉树的前中后遍历_第1张图片
二叉树的前序遍历
方法1,这个完全是我自己想的。在做完用队列实现二叉树的层次遍历后,按照这个思路,写了这个算法。
1,判断是否空树,如果是,则返回空;如果不是,则根入栈
2,栈不是空的,进入循环。新建一个树结点,把根赋给它,根出栈,对根处理;然后判断根是否有右子树,如果有则进栈;同理,判断是否有左子树,如果有则进栈。第一遍循环结束,然后再循环,直到遍历完。

vector<int> preorderTraversal(TreeNode *root) {
       vector<int>vec;
       if( ! root)
           return vec;
        stackstack;
        stack.push(root);
        while(! stack.empty())
        {
            TreeNode *head=stack.top();
            stack.pop();
            vec.push_back(head->val);
            if(head->right)
                stack.push(head->right);
            if(head->left)
                stack.push(head->left);
        }
        return vec;
    }

方法2,这个方法参考网上代码,和下面中序遍历一脉相承,只改动一处地方,把对数据的处理提到前面。

vector<int> preorderTraversal(TreeNode * root) {
        // write your code here
        vector<int> vec;
        stack stack;
        TreeNode *head=root;
        while( !stack.empty() || head)
        {
            if(head)
            {
                vec.push_back(head->val); //数据处理
                stack.push(head);
                head=head->left;
            }
            else
            {
                head=stack.top();
                stack.pop(); 
                head=head->right;
            }
        }
        return vec;
    }

中序遍历:左根右
1,在循环里,循环执行if,结点进栈,head移到左子树,直到找到最左结点。
2,栈顶出栈,对该数据处理,head移到右子树,如果该右子树有左子树,则重复执行第一步。

  vector<int> inorderTraversal(TreeNode * root) {
        // write your code here
        vector<int> vec;
        stack stack;
        TreeNode *head=root;
        while( !stack.empty() || head)
        {
            if(head)
            {
                stack.push(head);
                head=head->left;
            }
            else
            {
                head=stack.top();
                stack.pop();
                vec.push_back(head->val);
                head=head->right;
            }
        }
        return vec;
    }

后续遍历,参考来自以下博客,里面解释的很详细。
http://blog.csdn.net/u011116672/article/details/50221459

vector<int> postorderTraversal(TreeNode * root) {
        // write your code here
        vector<int> vec;
        stackstac;
        stack<int>stack_tag;
        TreeNode *head=root;
        while( !stac.empty() || head)
        {
            while(head)
            {
                stac.push(head);
                stack_tag.push(0);
                head=head->left;
            }
            while( !stac.empty() && stack_tag.top())
            {
                vec.push_back(stac.top()->val);
                stac.pop();
                stack_tag.pop();
            }
            if( !stac.empty())
            {
                stack_tag.pop();
                stack_tag.push(1);
                head=stac.top();
                head=head->right;
            }
        }
        return vec;
    }

你可能感兴趣的:(数据结构,LintCode)