题目:
Given a binary tree, return the preorder traversal of its nodes' values.
For example:
Given binary tree {1,#,2,3}
,
1 \ 2 / 3
return [1,2,3]
.
Note: Recursive solution is trivial, could you do it iteratively?
思想:
先序遍历,先遍历根节点,再遍历左右子树。可以采用递归和非递归两种方式。非递归方式要采用找来辅助。
代码:
/**
* Definition for a binary tree node.
**/
typedef struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
}*BinaryTree;
class Solution {
public:
void CreateTree(BinaryTree &T)//创建二叉树
{
char data;
cin >> data;
if (data == '#')
T = NULL;
else
{
T = new TreeNode(data - '0');
CreateTree(T->left);
CreateTree(T->right);
}
}
void preorder(TreeNode* root, vector<int> &ret)
{
if (root != NULL)
{
ret.push_back(root->val);
preorder(root->left,ret);
preorder(root->right,ret);
}
}
vector<int> preorderTraversal(TreeNode* root) {//递归
vector<int> ret;
preorder(root, ret);
return ret;
}
vector<int> preorderTraversal2(TreeNode* root) {//非递归
vector<int> ret;
stack<TreeNode *> s;
TreeNode *p = root;
while (p!=NULL || !s.empty())
{
while (p!=NULL)
{
ret.push_back(p->val);
s.push(p);
p = p->left;
}
if (!s.empty())
{
p = s.top();
s.pop();
p = p->right;
}
}
return ret;
}
};