zoukankan      html  css  js  c++  java
  • JZ-C-19

    剑指offer第十九题:二叉树的镜像

      1 //============================================================================
      2 // Name        : JZ-C-19.cpp
      3 // Author      : Laughing_Lz
      4 // Version     :
      5 // Copyright   : All Right Reserved
      6 // Description : 二叉树的镜像
      7 //============================================================================
      8 
      9 #include <iostream>
     10 #include <stdio.h>
     11 #include <stack>
     12 #include "BinaryTree.h"
     13 using namespace std;
     14 /**
     15  *前序遍历:递归
     16  */
     17 void MirrorRecursively(BinaryTreeNode* root) {
     18     if (root == NULL) {
     19         return;
     20     }
     21     if (root->m_pLeft == NULL && root->m_pRight == NULL) { //这里是&&
     22         return;
     23     }
     24     BinaryTreeNode* temp = root->m_pLeft;
     25     ; //临时结点,用于交换左右子孩子
     26     root->m_pLeft = root->m_pRight;
     27     root->m_pRight = temp;
     28     if (root->m_pLeft != NULL) {
     29         MirrorRecursively(root->m_pLeft);
     30     }
     31     if (root->m_pRight != NULL) {
     32         MirrorRecursively(root->m_pRight);
     33     }
     34 }
     35 /**
     36  *前序遍历:循环
     37  */
     38 void MirrorIteratively(BinaryTreeNode *root) {
     39     if (root == NULL) {
     40         return;
     41     }
     42     std::stack<BinaryTreeNode*> stackTreeNode; //利用栈的出入来存储每次需要遍历的结点
     43     stackTreeNode.push(root);
     44 
     45     while (stackTreeNode.size() > 0) {
     46         BinaryTreeNode *Node = stackTreeNode.top(); //拿到要操作的结点
     47         stackTreeNode.pop(); //出栈
     48 
     49         BinaryTreeNode *temp = Node->m_pLeft;
     50         Node->m_pLeft = Node->m_pRight;
     51         Node->m_pRight = temp;
     52 
     53         if (Node->m_pLeft != NULL) {
     54             stackTreeNode.push(Node->m_pLeft);
     55         }
     56         if (Node->m_pRight != NULL) {
     57             stackTreeNode.push(Node->m_pRight);
     58         }
     59     }
     60 }
     61 // ====================测试代码====================
     62 // 测试完全二叉树:除了叶子节点,其他节点都有两个子节点
     63 //            8
     64 //        6      10
     65 //       5 7    9  11
     66 void Test1() {
     67     printf("=====Test1 starts:=====
    ");
     68     BinaryTreeNode* pNode8 = CreateBinaryTreeNode(8);
     69     BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
     70     BinaryTreeNode* pNode10 = CreateBinaryTreeNode(10);
     71     BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
     72     BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);
     73     BinaryTreeNode* pNode9 = CreateBinaryTreeNode(9);
     74     BinaryTreeNode* pNode11 = CreateBinaryTreeNode(11);
     75 
     76     ConnectTreeNodes(pNode8, pNode6, pNode10);
     77     ConnectTreeNodes(pNode6, pNode5, pNode7);
     78     ConnectTreeNodes(pNode10, pNode9, pNode11);
     79 
     80     PrintTree(pNode8);
     81 
     82     printf("=====Test1: MirrorRecursively=====
    ");
     83     MirrorRecursively(pNode8);
     84     PrintTree(pNode8);
     85 
     86     printf("=====Test1: MirrorIteratively=====
    ");
     87     MirrorIteratively(pNode8);
     88     PrintTree(pNode8);
     89 
     90     DestroyTree(pNode8);
     91 }
     92 
     93 // 测试二叉树:出叶子结点之外,左右的结点都有且只有一个左子结点
     94 //            8
     95 //          7
     96 //        6
     97 //      5
     98 //    4
     99 void Test2() {
    100     printf("=====Test2 starts:=====
    ");
    101     BinaryTreeNode* pNode8 = CreateBinaryTreeNode(8);
    102     BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);
    103     BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
    104     BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
    105     BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
    106 
    107     ConnectTreeNodes(pNode8, pNode7, NULL);
    108     ConnectTreeNodes(pNode7, pNode6, NULL);
    109     ConnectTreeNodes(pNode6, pNode5, NULL);
    110     ConnectTreeNodes(pNode5, pNode4, NULL);
    111 
    112     PrintTree(pNode8);
    113 
    114     printf("=====Test2: MirrorRecursively=====
    ");
    115     MirrorRecursively(pNode8);
    116     PrintTree(pNode8);
    117 
    118     printf("=====Test2: MirrorIteratively=====
    ");
    119     MirrorIteratively(pNode8);
    120     PrintTree(pNode8);
    121 
    122     DestroyTree(pNode8);
    123 }
    124 
    125 // 测试二叉树:出叶子结点之外,左右的结点都有且只有一个右子结点
    126 //            8
    127 //             7
    128 //              6
    129 //               5
    130 //                4
    131 void Test3() {
    132     printf("=====Test3 starts:=====
    ");
    133     BinaryTreeNode* pNode8 = CreateBinaryTreeNode(8);
    134     BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);
    135     BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
    136     BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
    137     BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
    138 
    139     ConnectTreeNodes(pNode8, NULL, pNode7);
    140     ConnectTreeNodes(pNode7, NULL, pNode6);
    141     ConnectTreeNodes(pNode6, NULL, pNode5);
    142     ConnectTreeNodes(pNode5, NULL, pNode4);
    143 
    144     PrintTree(pNode8);
    145 
    146     printf("=====Test3: MirrorRecursively=====
    ");
    147     MirrorRecursively(pNode8);
    148     PrintTree(pNode8);
    149 
    150     printf("=====Test3: MirrorIteratively=====
    ");
    151     MirrorIteratively(pNode8);
    152     PrintTree(pNode8);
    153 
    154     DestroyTree(pNode8);
    155 }
    156 
    157 // 测试空二叉树:根结点为空指针
    158 void Test4() {
    159     printf("=====Test4 starts:=====
    ");
    160     BinaryTreeNode* pNode = NULL;
    161 
    162     PrintTree(pNode);
    163 
    164     printf("=====Test4: MirrorRecursively=====
    ");
    165     MirrorRecursively(pNode);
    166     PrintTree(pNode);
    167 
    168     printf("=====Test4: MirrorIteratively=====
    ");
    169     MirrorIteratively(pNode);
    170     PrintTree(pNode);
    171 }
    172 
    173 // 测试只有一个结点的二叉树
    174 void Test5() {
    175     printf("=====Test5 starts:=====
    ");
    176     BinaryTreeNode* pNode8 = CreateBinaryTreeNode(8);
    177 
    178     PrintTree(pNode8);
    179 
    180     printf("=====Test4: MirrorRecursively=====
    ");
    181     MirrorRecursively(pNode8);
    182     PrintTree(pNode8);
    183 
    184     printf("=====Test4: MirrorIteratively=====
    ");
    185     MirrorIteratively(pNode8);
    186     PrintTree(pNode8);
    187 }
    188 
    189 int main(int argc, char** argv) {
    190     Test1();
    191     Test2();
    192     Test3();
    193     Test4();
    194     Test5();
    195 
    196     return 0;
    197 }
  • 相关阅读:
    C#委托及事件 详解(讲得比较透彻)
    浅谈前端常用脚手架cli工具及案例
    C++实现二分法详解
    重新整理 .net core 实践篇————重定向攻击[三十九]
    动态规划_备忘录法_矩阵链乘问题
    完了,又火一个项目
    DOM常用的属性和方法
    一些胡乱的吐槽
    Mac安装compass失败的原因
    css动画animation-keyframes
  • 原文地址:https://www.cnblogs.com/Laughing-Lz/p/5577593.html
Copyright © 2011-2022 走看看