您的位置:首页 > 其它

二叉树的非递归遍历

2016-03-05 20:43 295 查看

二叉树的遍历

仅为自己提个醒,只因为它如此重要

前序

void preorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
TreeNode* p = root;
while (p || !st.empty()){
if (p){
cout << p->val << " ";//先访问节点,再压栈
st.push(p);
p = p->left;
}
else{
p = st.top();
st.pop();
p = p->right;
}
}
}


中序

void inorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
TreeNode* p = root;
while (p || !st.empty()){
if (p){
st.push(p);//先压栈
p = p->left;
}
else{
p = st.top();
st.pop();
cout << p->val << " ";//再访问
p = p->right;
}
}
}


后序

版本一:双栈


void postorderTraversal(TreeNode* root) {
if (root == NULL) return;
stack<TreeNode*> st,sr;     //st 辅助栈,sr 存放逆序的栈
st.push(root);
while (!st.empty()){
TreeNode* p = st.top();
st.pop();
sr.push(p);             //根进入栈
if (p->left){
st.push(p->left);   //左子树先进入st,后出栈,后进sr栈
}
if (p->right){
st.push(p->right);  //右子树后进入st,先出栈,先进sr栈
}
}
//------------------------->//在sr栈中的顺序为:根,右,左。
while (!sr.empty()){
cout << sr.top()->val << " ";
sr.pop();
}
}


版本二:单栈


void postorderTraversal(TreeNode* root) {
if (root == NULL) return;
stack<TreeNode*> s ;
TreeNode* cur = root;
TreeNode* pre = NULL;
while (cur || !s.empty())
{
while (cur)//当前结点的最“左下”节点
{
s.push(cur);
cur = cur->left;
}
cur = s.top();
if (cur->right == NULL || cur->right == pre){//当前结点没有右子树or当前结点的右子树已经访问过了
s.pop();
cout << cur->val << " ";
pre = cur;
cur = NULL;
}
else{
cur = cur->right;
}
}
}


层次遍历

层次遍历的应用

版本一队列

版本二递归
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 遍历