二叉树的链式存储结构是一类重要的数据结构,其形式定义如下:
Definition for a binary tree node.
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
一、前序遍历
vector<int> preorderTraversal(TreeNode* root) {
vector<int>r;
stack<TreeNode* >st;
if(root==NULL)return r;
TreeNode* p=root;
while(p||!st.empty()){
if(p){
st.push(p);
r.push_back(p->val);
p=p->left;
}
else{
p=st.top();
st.pop();
p=p->right;
}
}
return r;
}
二、中序遍历
vector<int> inorderTraversal(TreeNode* root) {
vector<int>r;
stack<TreeNode* >st;
if(root==NULL)return r;
TreeNode* p=root;
while(p||!st.empty()){
if(p){
st.push(p);
p=p->left;
}
else{
p=st.top();
st.pop();
r.push_back(p->val);
p=p->right;
}
}
return r;
}
三、后续遍历
vector<int> postorderTraversal(TreeNode *root)
{
vector<int> rs;
if (!root) return r;
stack<TreeNode *> st;
st.push(root); //当前节点入栈
TreeNode* t=root;
while (!st.empty())
{
t = st.top(); //栈顶节点出栈、输出
st.pop();
rs.push_back(t->val);
//注意,下面入栈顺序不能错 ,因为先左后右,
//这样出栈时先遍历才是右(中->右->左)
if (t->left) st.push(t->left);
if (t->right) st.push(t->right);
}
reverse(r.begin(), r.end()); //逆序,就成了后序遍历了
return r;
}
四、层次遍历
vector<int>Level(TreeNode* root) {
vector<int>r;
if(root==NULL)return r;
queue<TreeNode* >q;
TreeNode* p=root;
q.push(p);
while(!q.empty){
p=q.front();
r.push_back(p->val);
q.pop();
if(p->left){
q.push(p->left);
}
if(p->right){
q.push(p->right);
}
}
return r;
}