码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树镜像

时间:2016-06-25 23:03:44      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:

题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。

二叉树结点的定义如下:

struct BinaryTreeNode
{
    int              m_nValue;
    BinaryTreeNode*  m_pLeft;
    BinaryTreeNode*  m_pRight;
};

技术分享

1.递归实现

2.循环实现

  1 #include<stdio.h>
  2 #include<stack>
  3 
  4 struct BinaryTreeNode
  5 {
  6     int              m_nValue;
  7     BinaryTreeNode*  m_pLeft;
  8     BinaryTreeNode*  m_pRight;
  9 };
 10 
 11 BinaryTreeNode* CreateBinaryTreeNode(int value)
 12 {
 13     BinaryTreeNode* pNode = new BinaryTreeNode();
 14     pNode->m_nValue = value;
 15     pNode->m_pLeft = NULL;
 16     pNode->m_pRight = NULL;
 17 }
 18 
 19 void ConnectTreeNodes(BinaryTreeNode* pParent, BinaryTreeNode* pLeft, 
 20                     BinaryTreeNode* pRight)
 21 {
 22     if(pParent != NULL)
 23     {
 24         pParent->m_pLeft = pLeft;
 25         pParent->m_pRight = pRight;
 26     }
 27 }
 28 
 29 void PrintTreeNode(BinaryTreeNode* pNode)
 30 {
 31     if(pNode != NULL)
 32     {
 33         printf("value of this node is: %d.\n", pNode->m_nValue);
 34 
 35         if(pNode->m_pLeft != NULL)
 36             printf("value of its left child is: %d.\n", pNode->m_pLeft->m_nValue);
 37         else
 38             printf("left child is null .\n");
 39 
 40         if(pNode->m_pRight != NULL)
 41             printf("value of its right child is: %d.\n", pNode->m_pRight->m_nValue);
 42         else
 43             printf("right child is null.\n");
 44     }
 45     else
 46     {
 47         printf("this node is null.\n");
 48     }
 49     printf("\n");
 50 }
 51 
 52 void PrintTree(BinaryTreeNode* pRoot)
 53 {
 54     PrintTreeNode(pRoot);
 55 
 56     if(pRoot != NULL)
 57     {
 58         if(pRoot->m_pLeft != NULL)
 59             PrintTree(pRoot->m_pLeft);
 60         if(pRoot->m_pRight != NULL)
 61             PrintTree(pRoot->m_pRight);
 62     }
 63 }
 64 
 65 void DestroyTree(BinaryTreeNode* pRoot)
 66 {
 67     if(pRoot != NULL)
 68     {
 69         BinaryTreeNode* pLeft = pRoot->m_pLeft;
 70         BinaryTreeNode* pRight = pRoot->m_pRight;
 71         
 72         delete pRoot;
 73         pRoot = NULL;
 74         
 75         DestroyTree(pLeft);
 76         DestroyTree(pRight);
 77     }
 78 }
 79 
 80 //方法1 递归实现 
 81 void MirrorRecursively(BinaryTreeNode* pNode)
 82 {
 83     if(pNode == NULL)
 84         return;
 85     if(pNode->m_pLeft == NULL && pNode->m_pRight == NULL)
 86         return;
 87 
 88     BinaryTreeNode *pTemp = pNode->m_pLeft;
 89     pNode->m_pLeft = pNode->m_pRight;
 90     pNode->m_pRight = pTemp;
 91 
 92     if(pNode->m_pLeft)
 93         MirrorRecursively(pNode->m_pLeft);
 94     if(pNode->m_pRight)
 95         MirrorRecursively(pNode->m_pRight);
 96 }
 97 
 98 //方法二 循环实现 
 99 void MirrorIteratively(BinaryTreeNode* pRoot)
100 {
101     if(pRoot == NULL)
102         return;
103 
104     std::stack<BinaryTreeNode*> stackTreeNode;
105     stackTreeNode.push(pRoot);
106 
107     while(stackTreeNode.size() > 0)
108     {
109         BinaryTreeNode *pNode = stackTreeNode.top();
110         stackTreeNode.pop();
111 
112         BinaryTreeNode *pTemp = pNode->m_pLeft;
113         pNode->m_pLeft = pNode->m_pRight;
114         pNode->m_pRight = pTemp;
115 
116         if(pNode->m_pLeft)
117                 stackTreeNode.push(pNode->m_pLeft);
118         if(pNode->m_pRight)
119                 stackTreeNode.push(pNode->m_pRight);
120     }
121 }
122 
123 // 测试完全二叉树:除了叶子节点,其他节点都有两个子节点
124 //            8
125 //          /   126 //        6      10
127 //       / \     / 128 //      5   7   9  11
129 
130 int main()
131 {
132     BinaryTreeNode* pNode8 = CreateBinaryTreeNode(8);
133     BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
134     BinaryTreeNode* pNode10 = CreateBinaryTreeNode(10);
135     BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
136     BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);
137     BinaryTreeNode* pNode9 = CreateBinaryTreeNode(9);
138     BinaryTreeNode* pNode11 = CreateBinaryTreeNode(11);
139 
140     ConnectTreeNodes(pNode8, pNode6, pNode10);
141     ConnectTreeNodes(pNode6, pNode5, pNode7);
142     ConnectTreeNodes(pNode10, pNode9, pNode11);
143 
144     PrintTree(pNode8);
145 
146     printf("===== MirrorRecursively=====\n");
147     MirrorRecursively(pNode8);
148     PrintTree(pNode8);
149 
150     printf("===== MirrorIteratively=====\n");
151     MirrorIteratively(pNode8);
152     PrintTree(pNode8);
153 
154     DestroyTree(pNode8);
155 }

技术分享

 

二叉树镜像

标签:

原文地址:http://www.cnblogs.com/sankexin/p/5617057.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!