牛客网算法学习记录-二叉树

来源:互联网 发布:编辑地图的软件 编辑:程序博客网 时间:2024/06/05 16:56

请用递归方式实现二叉树的先序、中序和后序的遍历打印。

给定一个二叉树的根结点root,请依次返回二叉树的先序,中序和后续遍历(二维数组的形式)。


/*
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) {
        // write code here
        vector<vector<int>> result;
        vector<int> pre;
        vector<int> inOrder;
        vector<int> last;
        preTraversal(pre,root);
        inOrderTraversal(inOrder,root);
        lastTraversal(last,root);
        result.push_back(pre);
        result.push_back(inOrder);
        result.push_back(last);
        returnresult;
    }
     
    voidpreTraversal(vector<int> &vec,TreeNode *root){
        if(root == NULL)
            return;
        vec.push_back(root->val);
        preTraversal(vec,root->left);
        preTraversal(vec,root->right);
    }
     
    voidinOrderTraversal(vector<int> &vec,TreeNode *root){
        if(root == NULL){
            return;
        }
         
        inOrderTraversal(vec,root->left);
        vec.push_back(root->val);
        inOrderTraversal(vec,root->right);
         
    }
     
    voidlastTraversal(vector<int> &vec,TreeNode*root){
        if(root == NULL)
            return;
        lastTraversal(vec,root->left);
        lastTraversal(vec,root->right);
        vec.push_back(root->val);
    }
};


非递归实现:个人感觉没问题,运行的时候说超出给定内存==..

/*
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) {
        // write code here
        vector<vector<int>> result;
        vector<int> pre;
        vector<int> inOrder;
        vector<int> last;
        preTraversal(pre,root);
        inOrderTraversal(inOrder,root);
        lastTraversal(last,root);
        result.push_back(pre);
        result.push_back(inOrder);
        result.push_back(last);
        return result;
    }
    
    void preTraversal(vector<int> &vec,TreeNode *root){
        stack<TreeNode*> treeStack;
        treeStack.push(root);
        while(!treeStack.empty()){
            TreeNode* c = treeStack.top();
            vec.push_back(c->val);
            treeStack.pop();
            if(c->right !=NULL){
                treeStack.push(c->right);
            }
            if(c->left !=NULL){
                treeStack.push(c->left);
            }
        }
    }
    
    void inOrderTraversal(vector<int> &vec,TreeNode *root){
        stack<TreeNode*> treeStack;
        
        treeStack.push(root);
        TreeNode* cur;
        while(!treeStack.empty()||cur!=NULL){
            
            cur = treeStack.top();
            if(cur->left!=NULL){
                treeStack.push(cur->left);
             
            }
            else{
                treeStack.pop();
                vec.push_back(cur->val);
                cur = cur->right;
                if(cur !=NULL){
                    treeStack.push(cur);
                }
            }
        }
        
    }
    
    void lastTraversal(vector<int> &vec,TreeNode *root){
        
/*        stack<TreeNode*> treeStack1;
        stack<TreeNode*> treeStack2;
        treeStack1.push(root);
        TreeNode* cur ;
        while(!treeStack1.empty()){
            cur = treeStack1.top();
            treeStack1.pop();
            treeStack2.push(cur);
            if(cur->left !=NULL){
                treeStack1.push(cur->left);
            }
            if(cur->right !=NULL){
                treeStack1.push(cur->right);
            }
        }
        
        while(treeStack2.empty()){
            cur = treeStack2.top();
            vec.push_back(cur->val);
            treeStack1.pop();
        }
     */   
        
        stack<TreeNode*> treeStack;
        TreeNode*h,*c;
        treeStack.push(root);
        h =root;
        c = NULL;
        while(!treeStack.empty()){
            
            c = treeStack.top();
            if(c->left!=NULL&&c->left!=h&&c->right!=h){
                treeStack.push(c->left);
            }
            else if (c->right!=NULL&&h!=c->right){
                treeStack.push(c->right);
            }
            else {
                h = c;
                treeStack.pop();
                vec.push_back(c->val);
            }            
        }
    }
};


别人家的代码:

/*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) {// write code herevector<vector<int>>result;if (root==NULL){return result;}//先序递归遍历TreeNode*pre=root;TreeNode*mid=root;TreeNode*back=root;vector<int>a,b,c;pretransver(pre,a);midtransver(mid,b);backtransver(back,c);result.push_back(a);result.push_back(b);result.push_back(c);return result;}//先序遍历void pretransver(TreeNode*root,vector<int>&a){if (root==NULL){return ;}stack<TreeNode*>st;TreeNode*cur;st.push(root);while(!st.empty())//先压右孩子,再压左孩子,当栈为空时整个过程结束{cur=st.top();a.push_back(cur->val);st.pop();if (cur->right){st.push(cur->right);}if (cur->left){st.push(cur->left);}}    }//中序遍历void midtransver(TreeNode*root,vector<int>&b){if (root==NULL){return ;}      stack<TreeNode*>st;  TreeNode*cur;  cur=root;  while(cur)  {  st.push(cur);  cur=cur->left;  }  while(!st.empty()||cur!=NULL)  {  if (cur==NULL)  {  TreeNode* node=st.top();  b.push_back(node->val);  st.pop();  cur=node->right;  }  while(cur)  {  st.push(cur);  cur=cur->left;  }  }}//后序遍历void backtransver(TreeNode*root,vector<int>&c){if (root==NULL){return;}      stack<TreeNode*>st1;//使用两个栈来实现  stack<TreeNode*>st2;  st1.push(root);  while(!st1.empty())//知道第一个栈为空  {  TreeNode*cur=st1.top();  st2.push(cur);//每一个从栈1中弹出额节点都放入栈2中  st1.pop();  if (cur->left)  {  st1.push(cur->left);  }  if (cur->right)  {  st1.push(cur->right);  }  }  //从栈2中依次弹出节点并打印,就是后序遍历的  while(!st2.empty())  {  TreeNode*node=st2.top();  c.push_back(node->val);       st2.pop();  }}};

0 0
原创粉丝点击