二叉树的非递归遍历

来源:互联网 发布:mac 修复flash 插件 编辑:程序博客网 时间:2024/04/29 15:56

二叉树的遍历

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

前序

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;        }    }}

层次遍历

层次遍历的应用
版本一队列
版本二递归

0 0