• 二叉树镜像


    镜像——照镜子得出的像。特征就是左右反着,如下图

    思路

    仿着递归遍历,递归得到镜像

    • 输入结点指针p不为空且部位叶子,反转p的左右孩子
    • 找p的左孩子的镜像
    • 找p的右孩子的镜像

    参考代码

    void getImage(BinaryTreeNode *root)
    {
        if(root != NULL && root->m_pLeft != NULL && root->m_pRight != NULL)
        {
            BinaryTreeNode *temp = root->m_pLeft;
            root->m_pLeft = root->m_pRight;
            root->m_pRight = temp;
            getImage(root->m_pLeft);
            getImage(root->m_pRight);
        }
    }

    注意

    有需要判断一下叶子结点(当然可以不判断是否为叶子,但是判断叶子两句,反转三句话)

    完整运行

    #include <iostream>
    using namespace std;
    struct BinaryTreeNode
    {
        int m_nValue;
        BinaryTreeNode *m_pLeft;
        BinaryTreeNode *m_pRight;
    };
    void CreateTree(BinaryTreeNode *root)
    {
        BinaryTreeNode *p1 = new(BinaryTreeNode);
        p1->m_nValue = 8;
        p1->m_pLeft = NULL;
        p1->m_pRight = NULL;
        root->m_pLeft = p1;
    
        BinaryTreeNode *p2 = new(BinaryTreeNode);
        p2->m_nValue = 7;
        p2->m_pLeft = NULL;
        p2->m_pRight = NULL;
        root->m_pRight = p2;
    
        BinaryTreeNode *p3 = new(BinaryTreeNode);
        p3->m_nValue = 9;
        p3->m_pLeft = NULL;
        p3->m_pRight = NULL;
        p1->m_pLeft = p3;
    
        BinaryTreeNode *p4 = new(BinaryTreeNode);
        p4->m_nValue = 2;
        p4->m_pLeft = NULL;
        p4->m_pRight = NULL;
        p1->m_pRight = p4;
    
        BinaryTreeNode *p5 = new(BinaryTreeNode);
        p5->m_nValue = 4;
        p5->m_pLeft = NULL;
        p5->m_pRight = NULL;
        p4->m_pLeft = p5;
    
        BinaryTreeNode *p6 = new(BinaryTreeNode);
        p6->m_nValue = 7;
        p6->m_pLeft = NULL;
        p6->m_pRight = NULL;
        p4->m_pRight = p6;
    }
    void MidTraverse(BinaryTreeNode *root)
    {
        if(root != NULL)
        {
            MidTraverse(root->m_pLeft);
            cout << root->m_nValue << " ";
            MidTraverse(root->m_pRight);
        }
    }
    
    void DeleteTree(BinaryTreeNode *root)
    {
        if(root != NULL)
        {
            DeleteTree(root->m_pLeft);
            DeleteTree(root->m_pRight);
            delete(root);
            root = NULL;
        }
    }
    
    void getImage(BinaryTreeNode *root)
    {
        if(root != NULL && root->m_pLeft != NULL && root->m_pRight != NULL)
        {
            BinaryTreeNode *temp = root->m_pLeft;
            root->m_pLeft = root->m_pRight;
            root->m_pRight = temp;
            getImage(root->m_pLeft);
            getImage(root->m_pRight);
        }
    }
    int main()
    {
        BinaryTreeNode *root = new(BinaryTreeNode);
        root->m_nValue = 8;
        root->m_pLeft = NULL;
        root->m_pRight = NULL;
    
        CreateTree(root);
        MidTraverse(root);
        cout << endl;
    
        getImage(root);
    
        MidTraverse(root);
        cout << endl;
        DeleteTree(root);
    }
    View Code

    结果

    9 8 4 2 7 8 7
    7 8 7 2 4 8 9

  • 相关阅读:
    数据库锁机制
    spring的事务传播行为与隔离级别
    Logback+ELK+SpringMVC搭建日志收集服务器
    提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)
    有状态的bean和无状态的bean的区别
    浅谈Spring解决循环依赖的三种方式
    某类继承thread,同时实现runnable
    java动态代理
    缓存一致性
    Elasticsearch系列(一)--入门
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/3617858.html
Copyright © 2020-2023  润新知