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

定义节点

/**
* 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;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/silence_iz/article/details/52120764
个人分类: LintCode
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭