遍历二叉树(递归与非递归)

来源:互联网 发布:苏州app软件开发 编辑:程序博客网 时间:2024/05/29 17:13

非递归遍历:

1.申请一个新的栈stack

2.将头结点head压入stack

3.每次从stack中弹出栈顶节点,记为cur,然后点cur的值,如果cur的右孩子不为空,将cur的右孩子先压入stack,最后如果cur的左孩子不为空的话,将cur的左孩子压入stack

4.重复3

/*struct TreeNode {    int val;    struct TreeNode *left;    struct TreeNode *right;    TreeNode(int x) :            val(x), left(NULL), right(NULL) {    }};*/class TreeToSequence {public:    vector<vector<int> > convert(TreeNode* root) {        vector<vector<int>> save(3);        save[0]=xian(root,save[0]);        save[1]=zhong(root,save[1]);        save[2]=hou(root,save[2]);        return save;    }    vector<int> xian(TreeNode* root,vector<int> &a)//先序遍历        {        stack<TreeNode*> p;        TreeNode* q;        p.push(root);                             //先让栈顶入栈       while(!p.empty())           {           a.push_back(p.top()->val);            //打印栈顶元素           q=p.top();           p.pop();                              //弹出栈顶元素                      if(q->right!=NULL)                     //栈顶的右节点入栈               {           p.push(q->right);           }           if(q->left!=NULL)               {           p.push(q->left);                  //栈顶的左节点入栈           }       }        return a;    }    vector<int> zhong(TreeNode* root,vector<int> &a)        {        stack<TreeNode*> p;        TreeNode* q=root;        while(q!=NULL||!p.empty())            {            if(q!=NULL)    //如果做节点不是空,左节点入栈                {                p.push(q);                q=q->left;       //让q等于入栈的节点            }            else  //如果节点是空的,弹出栈顶节点                {                q=p.top();                a.push_back(q->val);                p.pop();                q=q->right;            }        }        return a;    }    vector<int> hou(TreeNode* root,vector<int> &a)        {        stack<TreeNode*> p;        stack<TreeNode*> q;        TreeNode* m=root;        p.push(root);        while(!p.empty())            {            m=p.top();   //第一个栈顶元素取出来            p.pop();     //删除栈顶元素            q.push(m);   //放入第二个栈中            if(m->left!=NULL)                {                p.push(m->left);            }            if(m->right!=NULL)                {                p.push(m->right);            }        }        int i=0;        while(!q.empty())            {            m=q.top();           a.push_back(m->val);            q.pop();        }        return a;    }};


递归遍历

/*struct TreeNode {    int val;    struct TreeNode *left;    struct TreeNode *right;    TreeNode(int x) :            val(x), left(NULL), right(NULL) {    }};*/class TreeToSequence {public:    vector<vector<int> > convert(TreeNode* root) {        vector<vector<int>> save(3);        xian(root,save[0]);  //先序        zhong(root,save[1]);//中序        hou(root,save[2]);//后序        return save;    }    void xian(TreeNode* root,vector<int> &a)             {        if(root==NULL)            return ;        a.push_back(root->val);//先序遍历,根节点先入栈        xian(root->left,a);        xian(root->right,a);    }    void zhong(TreeNode* root,vector<int> &a)        {          if(root==NULL)            return ;        zhong(root->left,a);        a.push_back(root->val);//中序遍历,根节点中间入栈        zhong(root->right,a);    }        void hou(TreeNode* root,vector<int> &a)         {          if(root==NULL)            return ;        hou(root->left,a);        hou(root->right,a);        a.push_back(root->val);//后序遍历,根节点后入栈    }    };