二叉树前、中、后序遍历【非递归】【LintCode测试平台】

来源:互联网 发布:奇迹暖暖每章套装知乎 编辑:程序博客网 时间:2024/06/15 08:03

定义节点

/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/

前序遍历

vector<int> preorderTraversal(TreeNode *root){    vector<int> result; //最终结果    stack<TreeNode*> s; //定义栈存放节点,【注意类型】    while( root != NULL || !s.empty() ){        /*将所有root节点下的左节点入栈*/        while( root != NULL ){            result.push_back(root->val);//访问root            s.push(root);            root = root->left;        }        /*左节点入栈完毕,可以访问左节点,即栈顶元素*/        TreeNode * temp = s.top();        s.pop();//出栈一个元素,即最后一个入栈的左节点        root = temp->right;//以temp的右节点作为新的根    }    return result;}

中序遍历

与前序遍历差不多,只是访问节点的时间不同:
- 前序遍历每进栈一个左节点立即访问
- 中序遍历当所有左节点入栈完后再访问最后一个左节点

vector<int> inorderTraversal(TreeNode *root){    vector<int> result;//最终结果    stack<TreeNode*> s; //定义栈存放节点,【注意类型】    while(root != NULL || !s.empty()){        /*将root下所有左节点入栈*/        while(root != NULL){            s.push(root);            root = root->left;        }        TreeNode *temp = s.top();        s.pop();//出栈最后一个左节点        result.push_back(temp->val);//访问        root = temp->right;//以temp的右节点作为新的根    }    return result;}

后序遍历

vector<int> postorderTraversal(TreeNode *root){    vector<int> result;    stack<TreeNode *> s;    if( root != NULL ){        do{            while(root != NULL ){  //将所有左节点进栈                s.push(root);                root = root->left;            }            TreeNode *temp = NULL;//指向栈顶节点的前一个已经访问过的节点            bool flag = true;//标志左孩子已经访问过或为空            while( !s.empty() && flag ){                root = s.top();                if( root->right == temp ){                    result.push_back(root->val);//访问                    s.pop();                    temp = root;                }else{                    root = root->right;//指向右节点                    flag = false;//root的左节点未访问                }            }        }while( !s.empty() );    }    return result;}
0 0
原创粉丝点击