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
- LintCode笔记(3)——二叉树的先序遍历
- LintCode笔记(4)——二叉树的层次遍历II
- lintcode——二叉树的前序遍历
- lintcode——二叉树的中序遍历
- lintcode——二叉树的后序遍历
- 二叉树的遍历C实现(非递归)—先序遍历
- LintCode -- 二叉树的前序遍历
- LintCode -- 二叉树的中序遍历
- LintCode -- 二叉树的后序遍历
- Lintcode 二叉树的后序遍历
- lintcode 二叉树的中序遍历
- lintcode 二叉树的前序遍历
- LintCode:二叉树的后序遍历
- lintcode:二叉树的中序遍历
- lintcode,二叉树的后序遍历
- lintcode,二叉树的前序遍历
- lintcode,二叉树的中序遍历
- LintCode-二叉树的前序遍历
- join 用法
- 计算几何 ( 求两圆相交面积 )——Open-air shopping malls ( HDU 3264 )
- 如何提高逻辑思维的能力?
- javaGUI学习——在面板上画一张图片
- simhash
- LintCode笔记(3)——二叉树的先序遍历
- RecyclerView 多选 删除
- [leetcode] 36. Valid Sudoku
- CSS3-盒模型设计
- sed替换^M为回车
- SQL update已经存在的数据insert新的数据
- The Pilots Brothers' refrigerator
- https小结
- 使用USRP和GNU Radio实现GPS位置伪造