LintCode笔记(3)——二叉树的先序遍历

来源:互联网 发布:大众软件官网 编辑:程序博客网 时间:2024/05/21 09:01

给出一棵二叉树,返回其节点值的前序遍历。

样例

给出一棵二叉树 {1,#,2,3},

   1    \     2    /   3

 返回 [1,2,3].

挑战:不用递归做。


首先回顾一下二叉树的先序遍历,中序遍历和后序遍历。

二叉树的先序遍历:先遍历根,再遍历左子树和右子树;

二叉树的中序遍历:先遍历左子树,再遍历根和右子树;

二叉树的后序遍历:先遍历右子树,再遍历左子树和根。

下面实现的是递归先序遍历:

/** * Definition of TreeNode: * class TreeNode { * public: *     int val; *     TreeNode *left, *right; *     TreeNode(int val) { *         this->val = val; *         this->left = this->right = NULL; *     } * } */class Solution {public:    /**     * @param root: The root of binary tree.     * @return: Preorder in vector which contains node values.     */    vector<int> preorderTraversal(TreeNode *root) {        // write your code here        //树为空时,返回一个空的vector        if(root == NULL)        {            vector<int> tmp;            return tmp;        }        vector<int> result;        //遍历根节点,把根节点放入结果中        result.push_back(root->val);        //递归遍历左子树        vector<int> left = preorderTraversal(root->left);        result.insert(result.end(),left.begin(),left.end());        //递归遍历右子树        vector<int> right = preorderTraversal(root->right);        result.insert(result.end(),right.begin(),right.end());        return result;    }};


非递归的实现思路如下:

(1)遍历树的根节点,并将该节点入栈,判断是否有左孩子和右孩子;

(2)如果左子树不为空,则将其左孩子作为遍历的当前节点,并返回(1)继续操作;

(3)如果左子树为空,则该节点出栈,将其右孩子作为遍历的当前节点,返回(1)继续操作;

(4)持续上述过程,当栈空且当前遍历节点为空结束遍历。

代码如下所示:

/** * Definition of TreeNode: * class TreeNode { * public: *     int val; *     TreeNode *left, *right; *     TreeNode(int val) { *         this->val = val; *         this->left = this->right = NULL; *     } * } */class Solution {public:    /**     * @param root: The root of binary tree.     * @return: Preorder in vector which contains node values.     */    vector<int> preorderTraversal(TreeNode *root) {        // write your code here        vector<int> result;        stack<TreeNode*>nodes;        TreeNode *p = root;        while(p != NULL || !nodes.empty())        {            while(p != NULL)            {                result.push_back(p->val);                nodes.push(p);                p = p->left;            }            if(!nodes.empty())            {                p = nodes.top();                nodes.pop();                p = p->right;            }        }                return result;    }};


0 0