검지offer-지그재그 인쇄 두 갈래 나무

제목 설명은 함수를 지그재그로 인쇄하는 두 갈래 트리, 즉 첫 번째 줄은 왼쪽에서 오른쪽으로, 두 번째 줄은 오른쪽에서 왼쪽으로, 세 번째 줄은 왼쪽에서 오른쪽으로, 다른 줄은 이와 같이 인쇄합니다.

메서드 1, 계층 인쇄, 짝수 행 반전,

 vector<vector<int>> Print(TreeNode* root) 
{
    queue q;
    vector<vector<int> > V;
    if(root==nullptr)return V;
    q.push(root);
    int even = 0;
    while(!q.empty())
    {
        vector<int> tmp;// 
        int n = q.size();
        while(n--)
        {
            root = q.front();
            tmp.push_back(root->val);
            if(root->left)q.push(root->left);
            if(root->right)q.push(root->right);
             q.pop();
        }
        if(even)
            reverse(tmp.begin(), tmp.end());
        even = !even;
        V.push_back(tmp);
    }
    return V;
}

방법 2. 두 개의 창고로 서로 다른 층의 노드를 저장한다


한 층의 노드를 인쇄할 때 다음 층의 노드를 상응하는 창고에 저장합니다. 홀수층이라면 왼쪽 노드를 저장하고 오른쪽 노드를 첫 번째 창고에 저장합니다. 짝수층이면 오른쪽 노드를 저장하고 왼쪽 노드를 두 번째 창고에 저장합니다.
 vector<vector<int>> Print(TreeNode* root) 
{

    vector<vector<int> > V;
    if(root==nullptr)return V;
    stacks1,s2;  // s1, s2
    s1.push(root);
    while(!s1.empty()||!s2.empty())
    {
        if(!s1.empty())
        {
            vector<int> tmp;
            while(!s1.empty())        
            {
                TreeNode *root = s1.top();
                s1.pop();
                tmp.push_back(root->val);
                if(root->left)s2.push(root->left);
                if(root->right)s2.push(root->right);
            }
            V.push_back(tmp);
        }
        if(!s2.empty())
        {
            vector<int> tmp;
            while(!s2.empty())
            {
                TreeNode *root = s2.top();
                s2.pop();
                tmp.push_back(root->val);
                if(root->right)s1.push(root->right);// 
                if(root->left)s1.push(root->left);
            }
            V.push_back(tmp);
        }
    }
    return V;
}

좋은 웹페이지 즐겨찾기