zoukankan      html  css  js  c++  java
  • 《剑指offer》第三十二题III:之字形打印二叉树

    // 面试题32(三):之字形打印二叉树
    // 题目:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺
    // 序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,
    // 其他行以此类推。
    
    #include <cstdio>
    #include "BinaryTree.h"
    #include <stack>
    
    void Print(BinaryTreeNode* pRoot)
    {
        //整体思路和前两道题很像,先进先出变后进先出
    
        if (pRoot == nullptr)
            return;
    
        std::stack<BinaryTreeNode*> levels[2]; //创建两个栈
        int current = 0; //当前为奇数, 从左到右
        int next = 1; //下一层为偶数, 从右向左
    
        levels[current].push(pRoot);
    
        while (!levels[current].empty() || !levels[next].empty())
        {
            BinaryTreeNode* pNode = levels[current].top();
            printf("%d ", pNode->m_nValue);
            levels[current].pop();
    
            if (current == 0) //当前打印奇数序列, 从左到右
            {
                if (pNode->m_pLeft)
                    levels[next].push(pNode->m_pLeft);
                if (pNode->m_pRight)
                    levels[next].push(pNode->m_pRight);
            }
            else //当前打印偶数序列, 从右到左
            {
                if (pNode->m_pRight)
                    levels[next].push(pNode->m_pRight);
                if (pNode->m_pLeft)
                    levels[next].push(pNode->m_pLeft);
            }
    
            if (levels[current].empty()) //如果当前节点打印完了
            {
                printf("
    ");
                current = 1 - current;
                next = 1 - next;
            }
        }
    }
    // ====================测试代码====================
    //            8
    //        6      10
    //       5 7    9  11
    void Test1()
    {
        BinaryTreeNode* pNode8 = CreateBinaryTreeNode(8);
        BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
        BinaryTreeNode* pNode10 = CreateBinaryTreeNode(10);
        BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
        BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);
        BinaryTreeNode* pNode9 = CreateBinaryTreeNode(9);
        BinaryTreeNode* pNode11 = CreateBinaryTreeNode(11);
    
        ConnectTreeNodes(pNode8, pNode6, pNode10);
        ConnectTreeNodes(pNode6, pNode5, pNode7);
        ConnectTreeNodes(pNode10, pNode9, pNode11);
    
        printf("====Test1 Begins: ====
    ");
        printf("Expected Result is:
    ");
        printf("8 
    ");
        printf("10 6 
    ");
        printf("5 7 9 11 
    
    ");
    
        printf("Actual Result is: 
    ");
        Print(pNode8);
        printf("
    ");
    
        DestroyTree(pNode8);
    }
    
    //            5
    //          4
    //        3
    //      2
    void Test2()
    {
        BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
        BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
        BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
        BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
    
        ConnectTreeNodes(pNode5, pNode4, nullptr);
        ConnectTreeNodes(pNode4, pNode3, nullptr);
        ConnectTreeNodes(pNode3, pNode2, nullptr);
    
        printf("====Test2 Begins: ====
    ");
        printf("Expected Result is:
    ");
        printf("5 
    ");
        printf("4 
    ");
        printf("3 
    ");
        printf("2 
    
    ");
    
        printf("Actual Result is: 
    ");
        Print(pNode5);
        printf("
    ");
    
        DestroyTree(pNode5);
    }
    
    //        5
    //         4
    //          3
    //           2
    void Test3()
    {
        BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
        BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
        BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
        BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
    
        ConnectTreeNodes(pNode5, nullptr, pNode4);
        ConnectTreeNodes(pNode4, nullptr, pNode3);
        ConnectTreeNodes(pNode3, nullptr, pNode2);
    
        printf("====Test3 Begins: ====
    ");
        printf("Expected Result is:
    ");
        printf("5 
    ");
        printf("4 
    ");
        printf("3 
    ");
        printf("2 
    
    ");
    
        printf("Actual Result is: 
    ");
        Print(pNode5);
        printf("
    ");
    
        DestroyTree(pNode5);
    }
    
    void Test4()
    {
        BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
    
        printf("====Test4 Begins: ====
    ");
        printf("Expected Result is:
    ");
        printf("5 
    
    ");
    
        printf("Actual Result is: 
    ");
        Print(pNode5);
        printf("
    ");
    
        DestroyTree(pNode5);
    }
    
    void Test5()
    {
        printf("====Test5 Begins: ====
    ");
        printf("Expected Result is:
    ");
    
        printf("Actual Result is: 
    ");
        Print(nullptr);
        printf("
    ");
    }
    
    //        100
    //        /
    //       50   
    //         
    //         150
    void Test6()
    {
        BinaryTreeNode* pNode100 = CreateBinaryTreeNode(100);
        BinaryTreeNode* pNode50 = CreateBinaryTreeNode(50);
        BinaryTreeNode* pNode150 = CreateBinaryTreeNode(150);
    
        ConnectTreeNodes(pNode100, pNode50, nullptr);
        ConnectTreeNodes(pNode50, nullptr, pNode150);
    
        printf("====Test6 Begins: ====
    ");
        printf("Expected Result is:
    ");
        printf("100 
    ");
        printf("50 
    ");
        printf("150 
    
    ");
    
        printf("Actual Result is: 
    ");
        Print(pNode100);
        printf("
    ");
    }
    
    //                8
    //        4              12
    //     2     6       10      14
    //   1  3  5  7     9 11   13  15
    void Test7()
    {
        BinaryTreeNode* pNode8 = CreateBinaryTreeNode(8);
        BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
        BinaryTreeNode* pNode12 = CreateBinaryTreeNode(12);
        BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
        BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
        BinaryTreeNode* pNode10 = CreateBinaryTreeNode(10);
        BinaryTreeNode* pNode14 = CreateBinaryTreeNode(14);
        BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
        BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
        BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
        BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);
        BinaryTreeNode* pNode9 = CreateBinaryTreeNode(9);
        BinaryTreeNode* pNode11 = CreateBinaryTreeNode(11);
        BinaryTreeNode* pNode13 = CreateBinaryTreeNode(13);
        BinaryTreeNode* pNode15 = CreateBinaryTreeNode(15);
    
        ConnectTreeNodes(pNode8, pNode4, pNode12);
        ConnectTreeNodes(pNode4, pNode2, pNode6);
        ConnectTreeNodes(pNode12, pNode10, pNode14);
        ConnectTreeNodes(pNode2, pNode1, pNode3);
        ConnectTreeNodes(pNode6, pNode5, pNode7);
        ConnectTreeNodes(pNode10, pNode9, pNode11);
        ConnectTreeNodes(pNode14, pNode13, pNode15);
    
        printf("====Test7 Begins: ====
    ");
        printf("Expected Result is:
    ");
        printf("8 
    ");
        printf("12 4 
    ");
        printf("2 6 10 14 
    ");
        printf("15 13 11 9 7 5 3 1 
    
    ");
    
        printf("Actual Result is: 
    ");
        Print(pNode8);
        printf("
    ");
    
        DestroyTree(pNode8);
    }
    
    int main(int argc, char* argv[])
    {
        Test1();
        Test2();
        Test3();
        Test4();
        Test5();
        Test6();
        Test7();
    
        return 0;
    }
    测试代码

    分析:举例分析,奇偶数行打印顺序不同,所以下一行压入栈顺序也不同。

    /*
    struct TreeNode {
        int val;
        struct TreeNode *left;
        struct TreeNode *right;
        TreeNode(int x) :
                val(x), left(NULL), right(NULL) {
        }
    };
    */
    class Solution {
    public:
        vector<vector<int> > Print(TreeNode* pRoot) {
            
            std::stack<TreeNode*> levels[2];
            int current = 0;
            int next = 1;
            
            std::vector<vector<int> > printTreeNode;
            std::vector<int> printTemp;
            
            if (pRoot == nullptr)
                return printTreeNode;
            
            levels[current].push(pRoot);
            while (!levels[current].empty() || !levels[next].empty())
            {
                TreeNode* pNode = levels[current].top();
                levels[current].pop();
                
                printTemp.push_back(pNode->val);
                
                if (current == 0)
                {
                    if (pNode->left)
                        levels[next].push(pNode->left);
                    if (pNode->right)
                        levels[next].push(pNode->right);
                }
                else
                {
                    if (pNode->right)
                        levels[next].push(pNode->right);
                    if (pNode->left)
                        levels[next].push(pNode->left);
                }
                
                if (levels[current].empty())
                {
                    printTreeNode.push_back(printTemp);
                    printTemp.clear();
                    current = 1 - current;
                    next = 1 - next;
                }
            }
            return printTreeNode;
        }
        
    };
    牛客网提交代码
  • 相关阅读:
    知名网站的技术发展历程
    自己的代码仓库源码
    重构着讲解设计原则与模式——从DIP中“倒置”的含义说接口的正确使用
    jQuery Colorbox插件
    测试是否支持DOMAttrModified
    python(贪吃蛇)
    界面简洁,无广告,无插件,无网络却功能强播放器
    Asp.Net MVC 4 Web API
    理解MVC底层运行机制
    BS单点登陆(SSO)实现代码展示
  • 原文地址:https://www.cnblogs.com/ZSY-blog/p/12602375.html
Copyright © 2011-2022 走看看