二叉树结点类:
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x): val(x), left(NULL), right(NULL) {}
};
递归法:
class Solution{
public:
void preOrder(TreeNode *root, vector<int> &vec)
{
if(root != NULL)
{
vec.push_back(root->val);
postOrder(root->left, vec);
postOrder(root->right, vec);
}
}
vector<int> preorderTraversal(TreeNode *root)
{
vector<int> vec;
preOrder(root, vec);
return vec;
}
非递归法:
借助栈来实现后序遍历(根左右):
1、首先将根结点压进栈底,进入while()循环
2、在while()循环中取出栈顶元素,并将该元素的值插入到vector类型的变量res的尾部。
3、首先判断该栈顶元素的右结点是否为空,不为空则将该右结点压入栈中;再判断该栈顶元素的左结点是否为空,不为空则将该左结点压入栈中。在下一轮循环中(进入第2步)就会首先取出栈顶元素即右结点,并将右结点插入到res的尾部。
4、直到栈中无元素可取,停止循环。
class Solution {
public:
vector<int> preorderTraversal(TreeNode *root) {
vector<int> res;
if(root == NULL)
return res;
stack<TreeNode *> st;
st.push(root);
while(st.size())
{
TreeNode *temp = st.top();
st.pop();
res.push_back(temp->val);
if(temp->right)
st.push(temp->right);
if(temp->left)
st.push(temp->left);
}
return res;
}
};